├── .editorconfig ├── .github ├── FUNDING.yml └── workflows │ ├── FullCompileCheck.yml │ └── ReleaseBuilds.yml ├── .gitignore ├── .gitmodules ├── BUILD.md ├── CHANGELOG.md ├── CMakeLists.txt ├── Data ├── Audio │ ├── Duel.mp3 │ ├── Lose.mp3 │ ├── Shootout.mp3 │ ├── SoundBank │ │ ├── Alarm.aiff │ │ ├── BulletHit.aiff │ │ ├── BulletHitMetal.aiff │ │ ├── CoinSmash.aiff │ │ ├── CrateExplode.aiff │ │ ├── DeathSkull.aiff │ │ ├── DuelFail.aiff │ │ ├── DuelKey.aiff │ │ ├── DuelKeysDone.aiff │ │ ├── Empty.aiff │ │ ├── Explosion.aiff │ │ ├── GetCoin.aiff │ │ ├── GhostVaporize.aiff │ │ ├── GlassBreak.aiff │ │ ├── GunShot1.aiff │ │ ├── GunShot2.aiff │ │ ├── GunShot3.aiff │ │ ├── Hoof.aiff │ │ ├── LaunchMissile.aiff │ │ ├── Moo1.aiff │ │ ├── Moo2.aiff │ │ ├── Reload.aiff │ │ ├── Ricochet.aiff │ │ ├── ShieldHit.aiff │ │ ├── Spurs1.aiff │ │ ├── Spurs2.aiff │ │ ├── Swish.aiff │ │ ├── TimerChime.aiff │ │ ├── Trampled.aiff │ │ ├── WalkerAmbient.aiff │ │ ├── WalkerCrash.aiff │ │ ├── WalkerFootStep.aiff │ │ ├── Wind.aiff │ │ └── Yelp.aiff │ ├── Stampede.mp3 │ └── Theme.mp3 ├── Images │ ├── BigBoard.png │ ├── Credits.jpg │ ├── HighScores.jpg │ ├── Logo.png │ ├── LoseScreen.jpg │ ├── MainMenu.png │ ├── MainMenuArcade.png │ └── WinScreen.jpg ├── Models │ ├── buildings.bg3d │ ├── global.bg3d │ ├── swamp.bg3d │ ├── targetpractice.bg3d │ └── town.bg3d ├── Skeletons │ ├── Bandito.bg3d │ ├── Bandito.skeleton.rsrc │ ├── Billy.bg3d │ ├── Billy.skeleton.rsrc │ ├── FrogMan.bg3d │ ├── FrogMan.skeleton.rsrc │ ├── KangaCow.bg3d │ ├── KangaCow.skeleton.rsrc │ ├── KangaRex.bg3d │ ├── KangaRex.skeleton.rsrc │ ├── Rygar.bg3d │ ├── Rygar.skeleton.rsrc │ ├── Shorty.bg3d │ ├── Shorty.skeleton.rsrc │ ├── TremorAlien.bg3d │ ├── TremorAlien.skeleton.rsrc │ ├── TremorGhost.bg3d │ ├── TremorGhost.skeleton.rsrc │ ├── Walker.bg3d │ └── Walker.skeleton.rsrc ├── Sprites │ ├── bigboard │ │ ├── bigboard000.png │ │ ├── bigboard001.png │ │ ├── bigboard002.png │ │ ├── bigboard003.png │ │ ├── bigboard004.png │ │ ├── bigboard005.png │ │ ├── bigboard006.png │ │ ├── bigboard007.png │ │ ├── bigboard008.png │ │ ├── bigboard009.png │ │ ├── bigboard010.png │ │ ├── bigboard011.png │ │ ├── bigboard012.png │ │ ├── bigboard013.png │ │ ├── bigboard014.png │ │ └── bigboard015.png │ ├── cursor │ │ ├── cursor000.png │ │ └── cursor001.png │ ├── duel │ │ ├── duel000.png │ │ ├── duel001.png │ │ ├── duel002.png │ │ ├── duel003.png │ │ ├── duel004.png │ │ ├── duel005.png │ │ ├── duel006.png │ │ ├── duel007.png │ │ ├── duel008.png │ │ ├── duel009.png │ │ ├── duel010.png │ │ └── duel011.png │ ├── font │ │ ├── font000.png │ │ ├── font001.png │ │ ├── font002.png │ │ ├── font003.png │ │ ├── font004.png │ │ ├── font005.png │ │ ├── font006.png │ │ ├── font007.png │ │ ├── font008.png │ │ ├── font009.png │ │ ├── font010.png │ │ ├── font011.png │ │ ├── font012.png │ │ ├── font013.png │ │ ├── font014.png │ │ ├── font015.png │ │ ├── font016.png │ │ ├── font017.png │ │ ├── font018.png │ │ ├── font019.png │ │ ├── font020.png │ │ ├── font021.png │ │ ├── font022.png │ │ ├── font023.png │ │ ├── font024.png │ │ ├── font025.png │ │ ├── font026.png │ │ ├── font027.png │ │ ├── font028.png │ │ ├── font029.png │ │ ├── font030.png │ │ ├── font031.png │ │ ├── font032.png │ │ ├── font033.png │ │ ├── font034.png │ │ ├── font035.png │ │ ├── font036.png │ │ ├── font037.png │ │ ├── font038.png │ │ ├── font039.png │ │ ├── font040.png │ │ ├── font041.png │ │ ├── font042.png │ │ ├── font043.png │ │ ├── font044.png │ │ ├── font045.png │ │ ├── font046.png │ │ ├── font047.png │ │ ├── font048.png │ │ ├── font049.png │ │ ├── font050.png │ │ ├── font051.png │ │ ├── font052.png │ │ ├── font053.png │ │ ├── font054.png │ │ ├── font055.png │ │ ├── font056.png │ │ ├── font057.png │ │ ├── font058.png │ │ ├── font059.png │ │ ├── font060.png │ │ ├── font061.png │ │ ├── font062.png │ │ ├── font063.png │ │ ├── font064.png │ │ ├── font065.png │ │ ├── font066.png │ │ ├── font067.png │ │ ├── font068.png │ │ ├── font069.png │ │ ├── font070.png │ │ ├── font071.png │ │ ├── font072.png │ │ ├── font073.png │ │ ├── font074.png │ │ ├── font075.png │ │ ├── font076.png │ │ ├── font077.png │ │ ├── font078.png │ │ ├── font079.png │ │ ├── font080.png │ │ ├── font081.png │ │ ├── font082.png │ │ ├── font083.png │ │ ├── font084.png │ │ ├── font085.png │ │ ├── font086.png │ │ ├── font087.png │ │ ├── font088.png │ │ ├── font089.png │ │ ├── font090.png │ │ ├── font091.png │ │ ├── font092.png │ │ ├── font093.png │ │ └── font094.png │ ├── global │ │ ├── global000.png │ │ ├── global001.png │ │ ├── global002.png │ │ ├── global003.png │ │ ├── global004.png │ │ ├── global005.png │ │ ├── global006.png │ │ └── global007.png │ ├── infobar │ │ ├── infobar000.png │ │ ├── infobar001.png │ │ ├── infobar002.png │ │ ├── infobar003.png │ │ ├── infobar004.png │ │ ├── infobar005.png │ │ ├── infobar006.png │ │ ├── infobar007.png │ │ ├── infobar008.png │ │ ├── infobar009.png │ │ ├── infobar010.png │ │ └── infobar011.png │ ├── particle │ │ ├── particle000.png │ │ ├── particle001.png │ │ ├── particle002.png │ │ ├── particle003.png │ │ ├── particle004.png │ │ ├── particle005.png │ │ ├── particle006.png │ │ ├── particle007.png │ │ ├── particle008.png │ │ ├── particle009.png │ │ ├── particle010.png │ │ ├── particle011.png │ │ ├── particle012.png │ │ ├── particle013.png │ │ ├── particle014.png │ │ ├── particle015.png │ │ ├── particle016.png │ │ ├── particle017.png │ │ ├── particle018.png │ │ ├── particle019.png │ │ ├── particle020.png │ │ ├── particle021.png │ │ ├── particle022.png │ │ ├── particle023.png │ │ ├── particle024.png │ │ ├── particle025.png │ │ ├── particle026.png │ │ ├── particle027.png │ │ ├── particle028.png │ │ ├── particle029.png │ │ ├── particle030.png │ │ ├── particle031.png │ │ ├── particle032.png │ │ ├── particle033.png │ │ ├── particle034.png │ │ └── particle035.png │ ├── spheremap │ │ ├── spheremap000.png │ │ └── spheremap001.png │ └── stampede │ │ └── stampede000.png ├── System │ └── gamecontrollerdb.txt └── Terrain │ ├── swamp_duel.ter │ ├── swamp_duel.ter.rsrc │ ├── swamp_shootout.ter │ ├── swamp_shootout.ter.rsrc │ ├── swamp_stampede.ter │ ├── swamp_stampede.ter.rsrc │ ├── town_duel.ter │ ├── town_duel.ter.rsrc │ ├── town_shootout.ter │ ├── town_shootout.ter.rsrc │ ├── town_stampede.ter │ └── town_stampede.ter.rsrc ├── Instructions.pdf ├── LICENSE.md ├── README.md ├── Source ├── 3D │ ├── 3DMath.c │ ├── Camera.c │ ├── MetaObjects.c │ ├── OGL_Functions.c │ ├── OGL_Support.c │ ├── Pick.c │ ├── Sprites.c │ └── bg3d.c ├── Boot.cpp ├── Effects │ ├── Particles.c │ ├── Shards.c │ └── Sparkle.c ├── Enemy │ ├── Enemy.c │ ├── Enemy_Bandito.c │ ├── Enemy_FrogMan.c │ ├── Enemy_Rygar.c │ ├── Enemy_Shorty.c │ ├── Enemy_TremorAlien.c │ ├── Enemy_TremorGhost.c │ └── Enemy_Walker.c ├── Headers │ ├── 3dmath.h │ ├── bg3d.h │ ├── bones.h │ ├── camera.h │ ├── collision.h │ ├── effects.h │ ├── enemy.h │ ├── fences.h │ ├── file.h │ ├── game.h │ ├── globals.h │ ├── infobar.h │ ├── input.h │ ├── items.h │ ├── lzss.h │ ├── main.h │ ├── metaobjects.h │ ├── misc.h │ ├── miscscreens.h │ ├── mobjtypes.h │ ├── modescreen.h │ ├── objects.h │ ├── objtypes.h │ ├── ogl_functions.h │ ├── ogl_support.h │ ├── pick.h │ ├── player.h │ ├── shards.h │ ├── skeletonanim.h │ ├── skeletonjoints.h │ ├── skeletonobj.h │ ├── sobjtypes.h │ ├── sound2.h │ ├── sparkle.h │ ├── splineitems.h │ ├── sprites.h │ ├── stb_image.h │ ├── structs.h │ ├── terrain.h │ ├── triangulate.h │ ├── version.h │ ├── version.h.in │ ├── water.h │ └── window.h ├── Items │ └── Items.c ├── Player │ ├── Billy.c │ └── Player.c ├── Screens │ ├── BigBoard.c │ ├── HighScores.c │ ├── Infobar.c │ ├── MainMenu.c │ ├── MiscScreens.c │ └── Paused.c ├── Skeleton │ ├── Bones.c │ ├── SkeletonAnim.c │ ├── SkeletonJoints.c │ └── SkeletonObj.c ├── System │ ├── Areas │ │ ├── Duel.c │ │ ├── Shootout.c │ │ ├── Stampede.c │ │ └── TargetPractice.c │ ├── Collision.c │ ├── File.c │ ├── ISpPresets.r │ ├── Input.c │ ├── LZSS.c │ ├── LoadLevel.c │ ├── Main.c │ ├── Misc.c │ ├── Objects.c │ ├── Objects2.c │ ├── Sound.c │ ├── Window.c │ └── stb_image.c └── Terrain │ ├── Fences.c │ ├── SplineItems.c │ ├── Terrain.c │ ├── Terrain2.c │ └── Water.c ├── build.py ├── extern └── README.md ├── packaging ├── AppRun ├── BillyFrontier.icns ├── BillyFrontier.ico ├── ReadMe.txt.in ├── io.jor.billyfrontier.appdata.xml ├── io.jor.billyfrontier.desktop ├── io.jor.billyfrontier.png └── win32.rc.in └── screenshot.webp /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*.{c,cpp,h,hpp,txt}] 4 | charset = utf-8 5 | indent_style = tab 6 | indent_size = 4 7 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | ko_fi: jorio 2 | -------------------------------------------------------------------------------- /.github/workflows/FullCompileCheck.yml: -------------------------------------------------------------------------------- 1 | name: Full Compile Check 2 | 3 | on: [workflow_dispatch] 4 | 5 | jobs: 6 | full-compile-check: 7 | name: ${{ matrix.platform.name }} 8 | runs-on: ${{ matrix.platform.os }} 9 | timeout-minutes: 5 10 | 11 | strategy: 12 | fail-fast: false 13 | matrix: 14 | platform: 15 | - { name: Linux/GCC, os: ubuntu-latest, extraflags: "--system-sdl" } 16 | - { name: Linux/Clang, os: ubuntu-latest, extraflags: "--system-sdl", prefix: "CC=clang CXX=clang++"} 17 | - { name: Windows/VS2022, os: windows-2022, extraflags: "-G 'Visual Studio 17 2022'" } 18 | - { name: Mac, os: macos-latest } 19 | 20 | steps: 21 | - name: Install Linux build dependencies 22 | if: runner.os == 'Linux' 23 | run: | 24 | sudo apt update 25 | sudo apt install libsdl3-dev 26 | 27 | - uses: actions/checkout@v4 28 | with: {submodules: 'recursive'} 29 | 30 | - run: ${{matrix.platform.prefix}} python3 build.py --dependencies --configure --build ${{matrix.platform.extraflags}} 31 | -------------------------------------------------------------------------------- /.github/workflows/ReleaseBuilds.yml: -------------------------------------------------------------------------------- 1 | name: Make Release Builds 2 | 3 | on: [workflow_dispatch] 4 | 5 | jobs: 6 | build-linux-appimage: 7 | runs-on: ${{ matrix.platform.os }} 8 | timeout-minutes: 5 9 | strategy: 10 | fail-fast: false 11 | matrix: 12 | platform: # Use oldest available Ubuntu for maximum glibc compatibility 13 | - { name: x86_64, os: ubuntu-22.04 } 14 | - { name: aarch64, os: ubuntu-22.04-arm } 15 | steps: 16 | - uses: actions/checkout@v4 17 | with: {submodules: 'recursive'} 18 | - name: Get build dependencies from APT 19 | # cf. https://github.com/libsdl-org/SDL/blob/main/docs/README-linux.md 20 | # + desktop-file-utils for appimagetool 21 | run: | 22 | sudo apt update 23 | sudo apt install -y libasound2-dev libpulse-dev \ 24 | libaudio-dev libjack-dev libsndio-dev libx11-dev libxext-dev \ 25 | libxrandr-dev libxcursor-dev libxfixes-dev libxi-dev libxss-dev \ 26 | libxkbcommon-dev libdrm-dev libgbm-dev libgl1-mesa-dev libgles2-mesa-dev \ 27 | libegl1-mesa-dev libdbus-1-dev libibus-1.0-dev libudev-dev fcitx-libs-dev \ 28 | libpipewire-0.3-dev libwayland-dev libdecor-0-dev liburing-dev \ 29 | desktop-file-utils 30 | - run: echo "ARTIFACT_NAME=$(python3 build.py --print-artifact-name)" >> $GITHUB_ENV 31 | - run: python3 build.py --dependencies 32 | - run: python3 build.py --configure 33 | - run: python3 build.py --build 34 | - run: python3 build.py --package 35 | - uses: actions/upload-artifact@v4 36 | with: 37 | name: ${{env.ARTIFACT_NAME}} 38 | path: dist/ 39 | compression-level: 0 40 | 41 | build-windows: 42 | runs-on: windows-2022 43 | timeout-minutes: 5 44 | steps: 45 | - uses: actions/checkout@v4 46 | with: {submodules: 'recursive'} 47 | - run: | 48 | $ARTIFACT_NAME = python3 build.py --print-artifact-name 49 | echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> $env:GITHUB_ENV 50 | - run: python3 build.py --dependencies 51 | - run: python3 build.py --configure -G 'Visual Studio 17 2022' 52 | - run: python3 build.py --build 53 | - run: python3 build.py --package 54 | - uses: actions/upload-artifact@v4 55 | with: 56 | name: ${{env.ARTIFACT_NAME}} 57 | path: dist/ 58 | compression-level: 0 59 | 60 | build-macos: 61 | runs-on: macos-latest # as of January 2025, this still supports the macOS 10.13 deployment target 62 | timeout-minutes: 15 63 | env: 64 | CODE_SIGN_IDENTITY: ${{ secrets.APPLE_CODE_SIGN_IDENTITY }} 65 | steps: 66 | - uses: apple-actions/import-codesign-certs@v3 67 | with: 68 | p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} 69 | p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} 70 | - uses: actions/checkout@v4 71 | with: {submodules: 'recursive'} 72 | - name: Get artifact name 73 | run: echo "ARTIFACT_NAME=$(python3 build.py --print-artifact-name)" >> $GITHUB_ENV 74 | - run: python3 build.py --dependencies 75 | - run: python3 build.py --configure 76 | - run: python3 build.py --build 77 | - run: python3 build.py --package 78 | - name: Notarize 79 | run: | 80 | xcrun notarytool store-credentials GameNotarizationProfile --apple-id ${{ secrets.APPLE_NOTARIZATION_USERNAME }} --password ${{ secrets.APPLE_NOTARIZATION_PASSWORD }} --team-id ${{ secrets.APPLE_DEVELOPMENT_TEAM }} 81 | xcrun notarytool submit "dist/$ARTIFACT_NAME" --keychain-profile GameNotarizationProfile --wait 82 | - name: Staple 83 | run: xcrun stapler staple "dist/$ARTIFACT_NAME" 84 | - uses: actions/upload-artifact@v4 85 | with: 86 | name: ${{env.ARTIFACT_NAME}} 87 | path: dist/ 88 | compression-level: 0 89 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build*/ 2 | cmake-build-*/ 3 | cache/ 4 | extern/SDL3* 5 | dist/ 6 | 7 | # IDEs and OS-specific stuff 8 | .vs/ 9 | .idea/ 10 | .DS_Store 11 | *.user 12 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "extern/Pomme"] 2 | path = extern/Pomme 3 | url = https://github.com/jorio/Pomme 4 | -------------------------------------------------------------------------------- /BUILD.md: -------------------------------------------------------------------------------- 1 | # How to build Billy Frontier 2 | 3 | ## The easy way: build.py (automated build script) 4 | 5 | `build.py` can produce a game executable from a fresh clone of the repo in a single command. It will work on macOS, Windows and Linux, provided that your system has Python 3, CMake, and an adequate C++ compiler. 6 | 7 | ``` 8 | git clone --recurse-submodules https://github.com/jorio/BillyFrontier 9 | cd BillyFrontier 10 | python3 build.py 11 | ``` 12 | 13 | If you want to build the game **manually** instead, the rest of this document describes how to do just that on each of the big 3 desktop operating systems. 14 | 15 | ## How to build the game manually on macOS 16 | 17 | 1. Install the prerequisites: 18 | - Xcode (preferably the latest version) 19 | - [CMake](https://formulae.brew.sh/formula/cmake) 3.21+ (installing via Homebrew is recommended) 20 | 1. Clone the repo **recursively**: 21 | ``` 22 | git clone --recurse-submodules https://github.com/jorio/BillyFrontier 23 | cd BillyFrontier 24 | ``` 25 | 1. Download [SDL3-3.2.8.dmg](https://libsdl.org/release/SDL3-3.2.8.dmg), open it, then browse to SDL3.xcframework/macos-arm64_x86_64. In that folder, copy **SDL3.framework** to the game's **extern** folder. 26 | 1. Prep the Xcode project: 27 | ``` 28 | cmake -G Xcode -S . -B build 29 | ``` 30 | 1. Now you can open `build/BillyFrontier.xcodeproj` in Xcode, or you can just go ahead and build the game: 31 | ``` 32 | cmake --build build --config RelWithDebInfo 33 | ``` 34 | 1. The game gets built in `build/RelWithDebInfo/BillyFrontier.app`. Enjoy! 35 | 36 | ## How to build the game manually on Windows 37 | 38 | 1. Install the prerequisites: 39 | - Visual Studio 2022 with the C++ toolchain 40 | - [CMake](https://cmake.org/download/) 3.21+ 41 | 1. Clone the repo **recursively**: 42 | ``` 43 | git clone --recurse-submodules https://github.com/jorio/BillyFrontier 44 | cd BillyFrontier 45 | ``` 46 | 1. Download [SDL3-devel-3.2.8-VC.zip](https://libsdl.org/release/SDL3-devel-3.2.8-VC.zip), extract it, and copy **SDL3-3.2.8** to the **extern** folder. Rename **SDL3-3.2.8** to just **SDL3**. 47 | 1. Prep the Visual Studio solution: 48 | ``` 49 | cmake -G "Visual Studio 17 2022" -A x64 -S . -B build 50 | ``` 51 | 1. Now you can open `build/BillyFrontier.sln` in Visual Studio, or you can just go ahead and build the game: 52 | ``` 53 | cmake --build build --config Release 54 | ``` 55 | 1. The game gets built in `build/Release/BillyFrontier.exe`. Enjoy! 56 | 57 | ## How to build the game manually on Linux et al. 58 | 59 | 1. Install the prerequisites from your package manager: 60 | - Any C++20 compiler 61 | - CMake 3.21+ 62 | - SDL3 development library (e.g. "libsdl3-dev" on Ubuntu, "sdl3" on Arch, "SDL3-devel" on Fedora) 63 | - OpenGL development libraries (e.g. "libgl1-mesa-dev" on Ubuntu) 64 | 1. Clone the repo **recursively**: 65 | ``` 66 | git clone --recurse-submodules https://github.com/jorio/BillyFrontier 67 | cd BillyFrontier 68 | ``` 69 | 1. Build the game: 70 | ``` 71 | cmake -S . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo 72 | cmake --build build 73 | ``` 74 | If you'd like to enable runtime sanitizers, append `-DSANITIZE=1` to the **first** `cmake` call above. 75 | 1. The game gets built in `build/BillyFrontier`. Enjoy! 76 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Billy Frontier Changelog 2 | 3 | - **1.1.2 (NOT RELEASED YET)** 4 | 5 | - Updated to SDL 3 6 | - **NOTE:** The Mac version now requires macOS 10.13. 7 | 8 | - **1.1.1 (September 6, 2023)** 9 | - Improved rotation controls in shootout mode. Turning by slamming the mouse cursor to the edges of the screen feels much smoother now. You can also use the mouse wheel or horizontal trackpad scrolling to turn. 10 | - New settings to adjust mouse wheel scrolling speed and direction. 11 | - Fix minor graphical artifacts with smoke and flame effects. 12 | - macOS: Fixed right edge scrolling in shootouts on Retina displays (thanks, @tobiasjordan!) 13 | - Update SDL to 2.28.3. 14 | 15 | - **1.1.0 (September 29, 2022)** 16 | - Initial playable release of the modern source port 17 | - Widescreen support 18 | 19 | --- 20 | 21 | - **1.0.4 (November 22, 2007)**: Last official release for PowerPC Macs 22 | 23 | - **1.0**: Initial release 24 | -------------------------------------------------------------------------------- /Data/Audio/Duel.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/Duel.mp3 -------------------------------------------------------------------------------- /Data/Audio/Lose.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/Lose.mp3 -------------------------------------------------------------------------------- /Data/Audio/Shootout.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/Shootout.mp3 -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Alarm.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Alarm.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/BulletHit.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/BulletHit.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/BulletHitMetal.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/BulletHitMetal.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/CoinSmash.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/CoinSmash.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/CrateExplode.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/CrateExplode.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/DeathSkull.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/DeathSkull.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/DuelFail.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/DuelFail.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/DuelKey.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/DuelKey.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/DuelKeysDone.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/DuelKeysDone.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Empty.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Empty.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Explosion.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Explosion.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/GetCoin.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/GetCoin.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/GhostVaporize.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/GhostVaporize.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/GlassBreak.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/GlassBreak.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/GunShot1.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/GunShot1.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/GunShot2.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/GunShot2.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/GunShot3.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/GunShot3.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Hoof.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Hoof.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/LaunchMissile.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/LaunchMissile.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Moo1.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Moo1.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Moo2.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Moo2.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Reload.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Reload.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Ricochet.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Ricochet.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/ShieldHit.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/ShieldHit.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Spurs1.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Spurs1.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Spurs2.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Spurs2.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Swish.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Swish.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/TimerChime.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/TimerChime.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Trampled.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Trampled.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/WalkerAmbient.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/WalkerAmbient.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/WalkerCrash.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/WalkerCrash.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/WalkerFootStep.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/WalkerFootStep.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Wind.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Wind.aiff -------------------------------------------------------------------------------- /Data/Audio/SoundBank/Yelp.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/SoundBank/Yelp.aiff -------------------------------------------------------------------------------- /Data/Audio/Stampede.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/Stampede.mp3 -------------------------------------------------------------------------------- /Data/Audio/Theme.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Audio/Theme.mp3 -------------------------------------------------------------------------------- /Data/Images/BigBoard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Images/BigBoard.png -------------------------------------------------------------------------------- /Data/Images/Credits.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Images/Credits.jpg -------------------------------------------------------------------------------- /Data/Images/HighScores.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Images/HighScores.jpg -------------------------------------------------------------------------------- /Data/Images/Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Images/Logo.png -------------------------------------------------------------------------------- /Data/Images/LoseScreen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Images/LoseScreen.jpg -------------------------------------------------------------------------------- /Data/Images/MainMenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Images/MainMenu.png -------------------------------------------------------------------------------- /Data/Images/MainMenuArcade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Images/MainMenuArcade.png -------------------------------------------------------------------------------- /Data/Images/WinScreen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Images/WinScreen.jpg -------------------------------------------------------------------------------- /Data/Models/buildings.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Models/buildings.bg3d -------------------------------------------------------------------------------- /Data/Models/global.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Models/global.bg3d -------------------------------------------------------------------------------- /Data/Models/swamp.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Models/swamp.bg3d -------------------------------------------------------------------------------- /Data/Models/targetpractice.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Models/targetpractice.bg3d -------------------------------------------------------------------------------- /Data/Models/town.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Models/town.bg3d -------------------------------------------------------------------------------- /Data/Skeletons/Bandito.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/Bandito.bg3d -------------------------------------------------------------------------------- /Data/Skeletons/Bandito.skeleton.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/Bandito.skeleton.rsrc -------------------------------------------------------------------------------- /Data/Skeletons/Billy.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/Billy.bg3d -------------------------------------------------------------------------------- /Data/Skeletons/Billy.skeleton.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/Billy.skeleton.rsrc -------------------------------------------------------------------------------- /Data/Skeletons/FrogMan.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/FrogMan.bg3d -------------------------------------------------------------------------------- /Data/Skeletons/FrogMan.skeleton.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/FrogMan.skeleton.rsrc -------------------------------------------------------------------------------- /Data/Skeletons/KangaCow.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/KangaCow.bg3d -------------------------------------------------------------------------------- /Data/Skeletons/KangaCow.skeleton.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/KangaCow.skeleton.rsrc -------------------------------------------------------------------------------- /Data/Skeletons/KangaRex.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/KangaRex.bg3d -------------------------------------------------------------------------------- /Data/Skeletons/KangaRex.skeleton.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/KangaRex.skeleton.rsrc -------------------------------------------------------------------------------- /Data/Skeletons/Rygar.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/Rygar.bg3d -------------------------------------------------------------------------------- /Data/Skeletons/Rygar.skeleton.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/Rygar.skeleton.rsrc -------------------------------------------------------------------------------- /Data/Skeletons/Shorty.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/Shorty.bg3d -------------------------------------------------------------------------------- /Data/Skeletons/Shorty.skeleton.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/Shorty.skeleton.rsrc -------------------------------------------------------------------------------- /Data/Skeletons/TremorAlien.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/TremorAlien.bg3d -------------------------------------------------------------------------------- /Data/Skeletons/TremorAlien.skeleton.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/TremorAlien.skeleton.rsrc -------------------------------------------------------------------------------- /Data/Skeletons/TremorGhost.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/TremorGhost.bg3d -------------------------------------------------------------------------------- /Data/Skeletons/TremorGhost.skeleton.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/TremorGhost.skeleton.rsrc -------------------------------------------------------------------------------- /Data/Skeletons/Walker.bg3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/Walker.bg3d -------------------------------------------------------------------------------- /Data/Skeletons/Walker.skeleton.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Skeletons/Walker.skeleton.rsrc -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard000.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard001.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard002.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard003.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard004.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard005.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard006.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard007.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard008.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard009.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard010.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard011.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard012.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard013.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard014.png -------------------------------------------------------------------------------- /Data/Sprites/bigboard/bigboard015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/bigboard/bigboard015.png -------------------------------------------------------------------------------- /Data/Sprites/cursor/cursor000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/cursor/cursor000.png -------------------------------------------------------------------------------- /Data/Sprites/cursor/cursor001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/cursor/cursor001.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel000.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel001.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel002.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel003.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel004.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel005.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel006.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel007.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel008.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel009.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel010.png -------------------------------------------------------------------------------- /Data/Sprites/duel/duel011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/duel/duel011.png -------------------------------------------------------------------------------- /Data/Sprites/font/font000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font000.png -------------------------------------------------------------------------------- /Data/Sprites/font/font001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font001.png -------------------------------------------------------------------------------- /Data/Sprites/font/font002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font002.png -------------------------------------------------------------------------------- /Data/Sprites/font/font003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font003.png -------------------------------------------------------------------------------- /Data/Sprites/font/font004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font004.png -------------------------------------------------------------------------------- /Data/Sprites/font/font005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font005.png -------------------------------------------------------------------------------- /Data/Sprites/font/font006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font006.png -------------------------------------------------------------------------------- /Data/Sprites/font/font007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font007.png -------------------------------------------------------------------------------- /Data/Sprites/font/font008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font008.png -------------------------------------------------------------------------------- /Data/Sprites/font/font009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font009.png -------------------------------------------------------------------------------- /Data/Sprites/font/font010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font010.png -------------------------------------------------------------------------------- /Data/Sprites/font/font011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font011.png -------------------------------------------------------------------------------- /Data/Sprites/font/font012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font012.png -------------------------------------------------------------------------------- /Data/Sprites/font/font013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font013.png -------------------------------------------------------------------------------- /Data/Sprites/font/font014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font014.png -------------------------------------------------------------------------------- /Data/Sprites/font/font015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font015.png -------------------------------------------------------------------------------- /Data/Sprites/font/font016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font016.png -------------------------------------------------------------------------------- /Data/Sprites/font/font017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font017.png -------------------------------------------------------------------------------- /Data/Sprites/font/font018.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font018.png -------------------------------------------------------------------------------- /Data/Sprites/font/font019.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font019.png -------------------------------------------------------------------------------- /Data/Sprites/font/font020.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font020.png -------------------------------------------------------------------------------- /Data/Sprites/font/font021.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font021.png -------------------------------------------------------------------------------- /Data/Sprites/font/font022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font022.png -------------------------------------------------------------------------------- /Data/Sprites/font/font023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font023.png -------------------------------------------------------------------------------- /Data/Sprites/font/font024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font024.png -------------------------------------------------------------------------------- /Data/Sprites/font/font025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font025.png -------------------------------------------------------------------------------- /Data/Sprites/font/font026.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font026.png -------------------------------------------------------------------------------- /Data/Sprites/font/font027.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font027.png -------------------------------------------------------------------------------- /Data/Sprites/font/font028.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font028.png -------------------------------------------------------------------------------- /Data/Sprites/font/font029.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font029.png -------------------------------------------------------------------------------- /Data/Sprites/font/font030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font030.png -------------------------------------------------------------------------------- /Data/Sprites/font/font031.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font031.png -------------------------------------------------------------------------------- /Data/Sprites/font/font032.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font032.png -------------------------------------------------------------------------------- /Data/Sprites/font/font033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font033.png -------------------------------------------------------------------------------- /Data/Sprites/font/font034.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font034.png -------------------------------------------------------------------------------- /Data/Sprites/font/font035.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font035.png -------------------------------------------------------------------------------- /Data/Sprites/font/font036.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font036.png -------------------------------------------------------------------------------- /Data/Sprites/font/font037.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font037.png -------------------------------------------------------------------------------- /Data/Sprites/font/font038.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font038.png -------------------------------------------------------------------------------- /Data/Sprites/font/font039.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font039.png -------------------------------------------------------------------------------- /Data/Sprites/font/font040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font040.png -------------------------------------------------------------------------------- /Data/Sprites/font/font041.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font041.png -------------------------------------------------------------------------------- /Data/Sprites/font/font042.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font042.png -------------------------------------------------------------------------------- /Data/Sprites/font/font043.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font043.png -------------------------------------------------------------------------------- /Data/Sprites/font/font044.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font044.png -------------------------------------------------------------------------------- /Data/Sprites/font/font045.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font045.png -------------------------------------------------------------------------------- /Data/Sprites/font/font046.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font046.png -------------------------------------------------------------------------------- /Data/Sprites/font/font047.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font047.png -------------------------------------------------------------------------------- /Data/Sprites/font/font048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font048.png -------------------------------------------------------------------------------- /Data/Sprites/font/font049.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font049.png -------------------------------------------------------------------------------- /Data/Sprites/font/font050.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font050.png -------------------------------------------------------------------------------- /Data/Sprites/font/font051.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font051.png -------------------------------------------------------------------------------- /Data/Sprites/font/font052.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font052.png -------------------------------------------------------------------------------- /Data/Sprites/font/font053.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font053.png -------------------------------------------------------------------------------- /Data/Sprites/font/font054.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font054.png -------------------------------------------------------------------------------- /Data/Sprites/font/font055.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font055.png -------------------------------------------------------------------------------- /Data/Sprites/font/font056.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font056.png -------------------------------------------------------------------------------- /Data/Sprites/font/font057.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font057.png -------------------------------------------------------------------------------- /Data/Sprites/font/font058.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font058.png -------------------------------------------------------------------------------- /Data/Sprites/font/font059.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font059.png -------------------------------------------------------------------------------- /Data/Sprites/font/font060.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font060.png -------------------------------------------------------------------------------- /Data/Sprites/font/font061.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font061.png -------------------------------------------------------------------------------- /Data/Sprites/font/font062.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font062.png -------------------------------------------------------------------------------- /Data/Sprites/font/font063.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font063.png -------------------------------------------------------------------------------- /Data/Sprites/font/font064.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font064.png -------------------------------------------------------------------------------- /Data/Sprites/font/font065.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font065.png -------------------------------------------------------------------------------- /Data/Sprites/font/font066.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font066.png -------------------------------------------------------------------------------- /Data/Sprites/font/font067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font067.png -------------------------------------------------------------------------------- /Data/Sprites/font/font068.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font068.png -------------------------------------------------------------------------------- /Data/Sprites/font/font069.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font069.png -------------------------------------------------------------------------------- /Data/Sprites/font/font070.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font070.png -------------------------------------------------------------------------------- /Data/Sprites/font/font071.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font071.png -------------------------------------------------------------------------------- /Data/Sprites/font/font072.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font072.png -------------------------------------------------------------------------------- /Data/Sprites/font/font073.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font073.png -------------------------------------------------------------------------------- /Data/Sprites/font/font074.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font074.png -------------------------------------------------------------------------------- /Data/Sprites/font/font075.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font075.png -------------------------------------------------------------------------------- /Data/Sprites/font/font076.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font076.png -------------------------------------------------------------------------------- /Data/Sprites/font/font077.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font077.png -------------------------------------------------------------------------------- /Data/Sprites/font/font078.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font078.png -------------------------------------------------------------------------------- /Data/Sprites/font/font079.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font079.png -------------------------------------------------------------------------------- /Data/Sprites/font/font080.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font080.png -------------------------------------------------------------------------------- /Data/Sprites/font/font081.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font081.png -------------------------------------------------------------------------------- /Data/Sprites/font/font082.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font082.png -------------------------------------------------------------------------------- /Data/Sprites/font/font083.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font083.png -------------------------------------------------------------------------------- /Data/Sprites/font/font084.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font084.png -------------------------------------------------------------------------------- /Data/Sprites/font/font085.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font085.png -------------------------------------------------------------------------------- /Data/Sprites/font/font086.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font086.png -------------------------------------------------------------------------------- /Data/Sprites/font/font087.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font087.png -------------------------------------------------------------------------------- /Data/Sprites/font/font088.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font088.png -------------------------------------------------------------------------------- /Data/Sprites/font/font089.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font089.png -------------------------------------------------------------------------------- /Data/Sprites/font/font090.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font090.png -------------------------------------------------------------------------------- /Data/Sprites/font/font091.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font091.png -------------------------------------------------------------------------------- /Data/Sprites/font/font092.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font092.png -------------------------------------------------------------------------------- /Data/Sprites/font/font093.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font093.png -------------------------------------------------------------------------------- /Data/Sprites/font/font094.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/font/font094.png -------------------------------------------------------------------------------- /Data/Sprites/global/global000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/global/global000.png -------------------------------------------------------------------------------- /Data/Sprites/global/global001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/global/global001.png -------------------------------------------------------------------------------- /Data/Sprites/global/global002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/global/global002.png -------------------------------------------------------------------------------- /Data/Sprites/global/global003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/global/global003.png -------------------------------------------------------------------------------- /Data/Sprites/global/global004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/global/global004.png -------------------------------------------------------------------------------- /Data/Sprites/global/global005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/global/global005.png -------------------------------------------------------------------------------- /Data/Sprites/global/global006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/global/global006.png -------------------------------------------------------------------------------- /Data/Sprites/global/global007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/global/global007.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar000.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar001.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar002.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar003.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar004.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar005.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar006.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar007.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar008.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar009.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar010.png -------------------------------------------------------------------------------- /Data/Sprites/infobar/infobar011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/infobar/infobar011.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle000.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle001.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle002.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle003.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle004.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle005.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle006.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle007.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle008.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle009.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle010.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle011.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle012.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle013.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle014.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle015.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle016.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle017.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle018.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle018.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle019.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle019.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle020.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle020.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle021.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle021.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle022.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle023.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle024.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle025.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle026.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle026.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle027.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle027.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle028.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle028.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle029.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle029.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle030.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle031.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle031.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle032.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle032.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle033.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle034.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle034.png -------------------------------------------------------------------------------- /Data/Sprites/particle/particle035.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/particle/particle035.png -------------------------------------------------------------------------------- /Data/Sprites/spheremap/spheremap000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/spheremap/spheremap000.png -------------------------------------------------------------------------------- /Data/Sprites/spheremap/spheremap001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/spheremap/spheremap001.png -------------------------------------------------------------------------------- /Data/Sprites/stampede/stampede000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Sprites/stampede/stampede000.png -------------------------------------------------------------------------------- /Data/Terrain/swamp_duel.ter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/swamp_duel.ter -------------------------------------------------------------------------------- /Data/Terrain/swamp_duel.ter.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/swamp_duel.ter.rsrc -------------------------------------------------------------------------------- /Data/Terrain/swamp_shootout.ter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/swamp_shootout.ter -------------------------------------------------------------------------------- /Data/Terrain/swamp_shootout.ter.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/swamp_shootout.ter.rsrc -------------------------------------------------------------------------------- /Data/Terrain/swamp_stampede.ter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/swamp_stampede.ter -------------------------------------------------------------------------------- /Data/Terrain/swamp_stampede.ter.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/swamp_stampede.ter.rsrc -------------------------------------------------------------------------------- /Data/Terrain/town_duel.ter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/town_duel.ter -------------------------------------------------------------------------------- /Data/Terrain/town_duel.ter.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/town_duel.ter.rsrc -------------------------------------------------------------------------------- /Data/Terrain/town_shootout.ter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/town_shootout.ter -------------------------------------------------------------------------------- /Data/Terrain/town_shootout.ter.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/town_shootout.ter.rsrc -------------------------------------------------------------------------------- /Data/Terrain/town_stampede.ter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/town_stampede.ter -------------------------------------------------------------------------------- /Data/Terrain/town_stampede.ter.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Data/Terrain/town_stampede.ter.rsrc -------------------------------------------------------------------------------- /Instructions.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/Instructions.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Billy Frontier 2 | 3 | This is a port of Pangea Software’s “cowboys in space” game **Billy Frontier** to modern operating systems. 4 | 5 | **Download the game for macOS, Windows and Linux here:** https://github.com/jorio/BillyFrontier/releases 6 | 7 | ![Billy Frontier Screenshot](screenshot.webp) 8 | 9 | ## About Billy Frontier 10 | 11 | Billy Frontier is an arcade style action game with a “cowboys in space” theme. You get to fight in duels, shootouts and stampedes. It’s the kind of game you’ll want to pick up and play whenever you get that twitch to just shoot something and blow stuff up! 12 | 13 | Billy Frontier was released for PowerPC Macs in 2003. This is a port of the game to modern operating systems. 14 | 15 | ### Controls 16 | 17 | Shootout controls: 18 | - **Shoot**: Left Mouse Button 19 | - **Duck**: Right Mouse Button or `Ctrl` key 20 | - **Turn**: either... 21 | - ...slam the cursor to the edge of the screen, 22 | - ...scroll the mouse wheel, 23 | - ...scroll horizontally on a trackpad, 24 | - ...or, press the `A`/`D` or left/right keys. 25 | - **Proceed** once all baddies are out: Middle Mouse Button or `⌘` key (Mac) or `Alt` key (Windows/Linux) 26 | 27 | Stampede controls: 28 | - **Turn**: `A`/`D` or left/right keys 29 | - **Jump**: `Spacebar` 30 | 31 | Duel controls: 32 | - Match the reflex sequence using the arrow keys. 33 | - To skip a duel, press `⌘`+`F10` (Mac) or `⊞`+`F10` (Windows/Linux) 34 | 35 | ### More documentation 36 | 37 | - [Original instruction manual](Instructions.pdf) 38 | - [BUILD](BUILD.md) – How to build the game from source 39 | - [CHANGELOG](CHANGELOG.md) – Billy Frontier version history 40 | - [LICENSE](LICENSE.md) – Licensing info (see also below) 41 | 42 | ### Legal info 43 | 44 | Billy Frontier © 2003 Pangea Software, Inc. Billy Frontier is a trademark of Pangea Software, Inc. This version was made and re-released here (https://github.com/jorio/BillyFrontier) under permission from Pangea Software, Inc. 45 | 46 | This version is licensed under [CC-BY-NC SA 4.0](LICENSE.md). 47 | 48 | ## More Pangea stuff! 49 | 50 | Check out my ports of [Bugdom](https://github.com/jorio/Bugdom), [Cro-Mag Rally](https://github.com/jorio/CroMagRally), [Mighty Mike (Power Pete)](https://github.com/jorio/MightyMike), [Nanosaur](https://github.com/jorio/Nanosaur), and [Otto Matic](https://github.com/jorio/OttoMatic). 51 | 52 | All ports are free of charge! If you’d like to support the development of Pangea game ports, feel free to visit https://jorio.itch.io and name your own price for any of the games there. Much appreciated! 😊 53 | -------------------------------------------------------------------------------- /Source/3D/OGL_Functions.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "game.h" 5 | 6 | PFNGLACTIVETEXTUREARBPROC procptr_glActiveTextureARB = NULL; 7 | PFNGLCLIENTACTIVETEXTUREARBPROC procptr_glClientActiveTextureARB = NULL; 8 | 9 | void OGL_InitFunctions(void) 10 | { 11 | procptr_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) SDL_GL_GetProcAddress("glActiveTextureARB"); 12 | procptr_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) SDL_GL_GetProcAddress("glClientActiveTextureARB"); 13 | 14 | GAME_ASSERT(procptr_glActiveTextureARB); 15 | GAME_ASSERT(procptr_glClientActiveTextureARB); 16 | } 17 | -------------------------------------------------------------------------------- /Source/Boot.cpp: -------------------------------------------------------------------------------- 1 | // BILLY FRONTIER ENTRY POINT 2 | // (C) 2025 Iliyas Jorio 3 | // This file is part of Billy Frontier. https://github.com/jorio/billyfrontier 4 | 5 | #include 6 | #include 7 | 8 | #include "Pomme.h" 9 | #include "PommeInit.h" 10 | #include "PommeFiles.h" 11 | 12 | extern "C" 13 | { 14 | #include "game.h" 15 | 16 | SDL_Window* gSDLWindow = nullptr; 17 | FSSpec gDataSpec; 18 | int gCurrentAntialiasingLevel; 19 | } 20 | 21 | static fs::path FindGameData(const char* executablePath) 22 | { 23 | fs::path dataPath; 24 | 25 | int attemptNum = 0; 26 | 27 | #if !(__APPLE__) 28 | attemptNum++; // skip macOS special case #0 29 | #endif 30 | 31 | if (!executablePath) 32 | attemptNum = 2; 33 | 34 | tryAgain: 35 | switch (attemptNum) 36 | { 37 | case 0: // special case for macOS app bundles 38 | dataPath = executablePath; 39 | dataPath = dataPath.parent_path().parent_path() / "Resources"; 40 | break; 41 | 42 | case 1: 43 | dataPath = executablePath; 44 | dataPath = dataPath.parent_path() / "Data"; 45 | break; 46 | 47 | case 2: 48 | dataPath = "Data"; 49 | break; 50 | 51 | default: 52 | throw std::runtime_error("Couldn't find the Data folder."); 53 | } 54 | 55 | attemptNum++; 56 | 57 | dataPath = dataPath.lexically_normal(); 58 | 59 | // Set data spec -- Lets the game know where to find its asset files 60 | gDataSpec = Pomme::Files::HostPathToFSSpec(dataPath / "System"); 61 | 62 | FSSpec someDataFileSpec; 63 | OSErr iErr = FSMakeFSSpec(gDataSpec.vRefNum, gDataSpec.parID, ":System:gamecontrollerdb.txt", &someDataFileSpec); 64 | if (iErr) 65 | { 66 | goto tryAgain; 67 | } 68 | 69 | return dataPath; 70 | } 71 | 72 | static void Boot(int argc, char** argv) 73 | { 74 | SDL_SetAppMetadata(GAME_FULL_NAME, GAME_VERSION, GAME_IDENTIFIER); 75 | #if _DEBUG 76 | SDL_SetLogPriorities(SDL_LOG_PRIORITY_VERBOSE); 77 | #else 78 | SDL_SetLogPriorities(SDL_LOG_PRIORITY_INFO); 79 | #endif 80 | 81 | // Start our "machine" 82 | Pomme::Init(); 83 | 84 | // Find path to game data folder 85 | const char* executablePath = argc > 0 ? argv[0] : NULL; 86 | fs::path dataPath = FindGameData(executablePath); 87 | 88 | // Load game prefs before starting 89 | LoadPrefs(); 90 | 91 | retryVideo: 92 | // Initialize SDL video subsystem 93 | if (!SDL_Init(SDL_INIT_VIDEO)) 94 | { 95 | throw std::runtime_error("Couldn't initialize SDL video subsystem."); 96 | } 97 | 98 | // Create window 99 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); 100 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); 101 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); 102 | 103 | gCurrentAntialiasingLevel = gGamePrefs.antialiasingLevel; 104 | if (gCurrentAntialiasingLevel != 0) 105 | { 106 | SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); 107 | SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 1 << gCurrentAntialiasingLevel); 108 | } 109 | 110 | gSDLWindow = SDL_CreateWindow( 111 | GAME_FULL_NAME " " GAME_VERSION, 112 | 640, 480, 113 | SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIGH_PIXEL_DENSITY); 114 | 115 | if (!gSDLWindow) 116 | { 117 | if (gCurrentAntialiasingLevel != 0) 118 | { 119 | SDL_Log("Couldn't create SDL window with the requested MSAA level. Retrying without MSAA..."); 120 | 121 | // retry without MSAA 122 | gGamePrefs.antialiasingLevel = 0; 123 | SDL_QuitSubSystem(SDL_INIT_VIDEO); 124 | goto retryVideo; 125 | } 126 | else 127 | { 128 | throw std::runtime_error("Couldn't create SDL window."); 129 | } 130 | } 131 | 132 | // Init gamepad subsystem 133 | SDL_Init(SDL_INIT_GAMEPAD); 134 | auto gamecontrollerdbPath8 = (dataPath / "System" / "gamecontrollerdb.txt").u8string(); 135 | if (-1 == SDL_AddGamepadMappingsFromFile((const char*)gamecontrollerdbPath8.c_str())) 136 | { 137 | SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_WARNING, GAME_FULL_NAME, "Couldn't load gamecontrollerdb.txt!", gSDLWindow); 138 | } 139 | } 140 | 141 | static void Shutdown() 142 | { 143 | // Always restore the user's mouse acceleration before exiting. 144 | // SetMacLinearMouse(false); 145 | 146 | Pomme::Shutdown(); 147 | 148 | if (gSDLWindow) 149 | { 150 | SDL_DestroyWindow(gSDLWindow); 151 | gSDLWindow = NULL; 152 | } 153 | 154 | SDL_Quit(); 155 | } 156 | 157 | int main(int argc, char** argv) 158 | { 159 | bool success = true; 160 | std::string uncaught = ""; 161 | 162 | try 163 | { 164 | Boot(argc, argv); 165 | GameMain(); 166 | } 167 | catch (Pomme::QuitRequest&) 168 | { 169 | // no-op, the game may throw this exception to shut us down cleanly 170 | } 171 | #if !(_DEBUG) 172 | // In release builds, catch anything that might be thrown by GameMain 173 | // so we can show an error dialog to the user. 174 | catch (std::exception& ex) // Last-resort catch 175 | { 176 | success = false; 177 | uncaught = ex.what(); 178 | } 179 | catch (...) // Last-resort catch 180 | { 181 | success = false; 182 | uncaught = "unknown"; 183 | } 184 | #endif 185 | 186 | Shutdown(); 187 | 188 | if (!success) 189 | { 190 | SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Uncaught exception: %s", uncaught.c_str()); 191 | SDL_ShowSimpleMessageBox(0, GAME_FULL_NAME, uncaught.c_str(), nullptr); 192 | } 193 | 194 | return success ? 0 : 1; 195 | } 196 | -------------------------------------------------------------------------------- /Source/Effects/Sparkle.c: -------------------------------------------------------------------------------- 1 | /****************************/ 2 | /* SPARKLE.C */ 3 | /* (c)2001 Pangea Software */ 4 | /* By Brian Greenstone */ 5 | /****************************/ 6 | 7 | 8 | /****************************/ 9 | /* EXTERNALS */ 10 | /****************************/ 11 | 12 | #include "game.h" 13 | 14 | /****************************/ 15 | /* PROTOTYPES */ 16 | /****************************/ 17 | 18 | 19 | 20 | /****************************/ 21 | /* CONSTANTS */ 22 | /****************************/ 23 | 24 | 25 | 26 | /*********************/ 27 | /* VARIABLES */ 28 | /*********************/ 29 | 30 | SparkleType gSparkles[MAX_SPARKLES]; 31 | 32 | static float gPlayerSparkleColor = 0; 33 | 34 | int gNumSparkles; 35 | 36 | /*************************** INIT SPARKLES **********************************/ 37 | 38 | void InitSparkles(void) 39 | { 40 | int i; 41 | 42 | for (i = 0; i < MAX_SPARKLES; i++) 43 | { 44 | gSparkles[i].isActive = false; 45 | } 46 | 47 | gPlayerSparkleColor = 0; 48 | 49 | gNumSparkles = 0; 50 | } 51 | 52 | 53 | /*************************** GET FREE SPARKLE ******************************/ 54 | // 55 | // OUTPUT: -1 if none 56 | // 57 | 58 | short GetFreeSparkle(ObjNode *theNode) 59 | { 60 | int i; 61 | 62 | /* FIND A FREE SLOT */ 63 | 64 | for (i = 0; i < MAX_SPARKLES; i++) 65 | { 66 | if (!gSparkles[i].isActive) 67 | goto got_it; 68 | 69 | } 70 | return(-1); 71 | 72 | got_it: 73 | 74 | gSparkles[i].isActive = true; 75 | gSparkles[i].owner = theNode; 76 | gNumSparkles++; 77 | 78 | return(i); 79 | } 80 | 81 | 82 | 83 | 84 | /***************** DELETE SPARKLE *********************/ 85 | 86 | void DeleteSparkle(short i) 87 | { 88 | if (i == -1) 89 | return; 90 | 91 | if (gSparkles[i].isActive) 92 | { 93 | gSparkles[i].isActive = false; 94 | gNumSparkles--; 95 | } 96 | else 97 | DoAlert("DeleteSparkle: double delete sparkle"); 98 | } 99 | 100 | 101 | /*************************** DRAW SPARKLES ******************************/ 102 | 103 | void DrawSparkles(void) 104 | { 105 | uint32_t flags; 106 | int i; 107 | float dot,separation; 108 | OGLMatrix4x4 m; 109 | OGLVector3D v; 110 | OGLPoint3D where; 111 | OGLVector3D aim; 112 | static const OGLVector3D up = {0,1,0}; 113 | OGLPoint3D tc[4], *cameraLocation; 114 | static OGLPoint3D frame[4] = 115 | { 116 | {-130,130,0}, 117 | {130,130,0}, 118 | {130,-130,0}, 119 | {-130,-130,0}, 120 | }; 121 | 122 | if (gIsPicking) 123 | return; 124 | 125 | 126 | OGL_PushState(); 127 | 128 | OGL_DisableLighting(); // deactivate lighting 129 | glDisable(GL_NORMALIZE); // disable vector normalizing since scale == 1 130 | glDisable(GL_CULL_FACE); // deactivate culling 131 | glDisable(GL_FOG); // deactivate fog 132 | glDepthMask(GL_FALSE); // no z-writes 133 | glEnable(GL_BLEND); 134 | glBlendFunc(GL_SRC_ALPHA, GL_ONE); // set blending mode 135 | 136 | 137 | /*********************/ 138 | /* DRAW EACH SPARKLE */ 139 | /*********************/ 140 | 141 | cameraLocation = &gGameViewInfoPtr->cameraPlacement.cameraLocation; // point to camera coord 142 | 143 | for (i = 0; i < MAX_SPARKLES; i++) 144 | { 145 | ObjNode *owner; 146 | 147 | if (!gSparkles[i].isActive) // must be active 148 | continue; 149 | 150 | flags = gSparkles[i].flags; // get sparkle flags 151 | 152 | owner = gSparkles[i].owner; 153 | if (owner != nil) // if owner is culled then dont draw 154 | { 155 | if (owner->StatusBits & (STATUS_BIT_ISCULLED|STATUS_BIT_HIDDEN)) 156 | continue; 157 | 158 | /* SEE IF TRANSFORM WITH OWNER */ 159 | 160 | if (flags & SPARKLE_FLAG_TRANSFORMWITHOWNER) 161 | { 162 | OGLPoint3D_Transform(&gSparkles[i].where, &owner->BaseTransformMatrix, &where); 163 | OGLVector3D_Transform(&gSparkles[i].aim, &owner->BaseTransformMatrix, &aim); 164 | } 165 | else 166 | { 167 | where = gSparkles[i].where; 168 | aim = gSparkles[i].aim; 169 | } 170 | } 171 | else 172 | { 173 | where = gSparkles[i].where; 174 | aim = gSparkles[i].aim; 175 | } 176 | 177 | 178 | /* CALC ANGLE INFO */ 179 | 180 | v.x = cameraLocation->x - where.x; // calc vector from sparkle to camera 181 | v.y = cameraLocation->y - where.y; 182 | v.z = cameraLocation->z - where.z; 183 | FastNormalizeVector(v.x, v.y, v.z, &v); 184 | 185 | separation = gSparkles[i].separation; 186 | where.x += v.x * separation; // offset the base point 187 | where.y += v.y * separation; 188 | where.z += v.z * separation; 189 | 190 | if (!(flags & SPARKLE_FLAG_OMNIDIRECTIONAL)) // if not omni then calc alpha based on angle 191 | { 192 | dot = OGLVector3D_Dot(&v, &aim); // calc angle between 193 | if (dot <= 0.0f) 194 | continue; 195 | 196 | gSparkles[i].color.a = dot; // make brighter as we look head-on 197 | } 198 | 199 | 200 | 201 | /* CALC TRANSFORM MATRIX */ 202 | 203 | frame[0].x = -gSparkles[i].scale; // set size of quad 204 | frame[0].y = gSparkles[i].scale; 205 | frame[1].x = gSparkles[i].scale; 206 | frame[1].y = gSparkles[i].scale; 207 | frame[2].x = gSparkles[i].scale; 208 | frame[2].y = -gSparkles[i].scale; 209 | frame[3].x = -gSparkles[i].scale; 210 | frame[3].y = -gSparkles[i].scale; 211 | 212 | SetLookAtMatrixAndTranslate(&m, &up, &where, cameraLocation); // aim at camera & translate 213 | OGLPoint3D_TransformArray(&frame[0], &m, tc, 4); 214 | 215 | 216 | 217 | /* DRAW IT */ 218 | 219 | MO_DrawMaterial(gSpriteGroupList[SPRITE_GROUP_PARTICLES][gSparkles[i].textureNum].materialObject); // submit material 220 | 221 | if (flags & SPARKLE_FLAG_FLICKER) // set transparency 222 | { 223 | OGLColorRGBA c = gSparkles[i].color; 224 | 225 | c.a += RandomFloat2() * .5f; 226 | if (c.a < 0.0) 227 | continue; 228 | else 229 | if (c.a > 1.0f) 230 | c.a = 1.0; 231 | 232 | SetColor4fv(c); 233 | } 234 | else 235 | SetColor4fv(gSparkles[i].color); 236 | 237 | glBegin(GL_QUADS); 238 | glTexCoord2f(0,0); glVertex3fv(&tc[0].x); 239 | glTexCoord2f(1,0); glVertex3fv(&tc[1].x); 240 | glTexCoord2f(1,1); glVertex3fv(&tc[2].x); 241 | glTexCoord2f(0,1); glVertex3fv(&tc[3].x); 242 | glEnd(); 243 | } 244 | 245 | 246 | /* RESTORE STATE */ 247 | 248 | OGL_PopState(); 249 | } 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | -------------------------------------------------------------------------------- /Source/Headers/bg3d.h: -------------------------------------------------------------------------------- 1 | // 2 | // bg3d.h 3 | // 4 | 5 | #pragma once 6 | 7 | // Externals 8 | #include "game.h" 9 | 10 | #define MAX_MULTITEXTURE_LAYERS 4 // max # of multi texture layers supported 11 | // WARNING: changing this may alter file format!! 12 | 13 | #define MAX_BG3D_MATERIALS 400 // max # of materials in a bg3d file 14 | 15 | #define MAX_BG3D_GROUPS ((int)MODEL_GROUP_SKELETONBASE+(int)MAX_SKELETON_TYPES) // skeletons are @ end of list, so can use these counts for max # 16 | 17 | 18 | /***********************/ 19 | /* BG3D FILE CONTAINER */ 20 | /***********************/ 21 | 22 | typedef struct 23 | { 24 | int numMaterials; 25 | MOMaterialObject *materials[MAX_BG3D_MATERIALS]; // references to all of the materials used in file 26 | MetaObjectPtr root; // the root object or group containing all geometry in file 27 | }BG3DFileContainer; 28 | 29 | 30 | 31 | /* BG3D HEADER */ 32 | 33 | typedef struct 34 | { 35 | char headerString[16]; // header string 36 | NumVersion version; // version of file 37 | }BG3DHeaderType; 38 | 39 | 40 | /* BG3D MATERIAL FLAGS */ 41 | 42 | enum 43 | { 44 | BG3D_MATERIALFLAG_TEXTURED = 1, 45 | BG3D_MATERIALFLAG_ALWAYSBLEND = (1<<1), // set if always want to GL_BLEND this texture when drawn 46 | BG3D_MATERIALFLAG_CLAMP_U = (1<<2), 47 | BG3D_MATERIALFLAG_CLAMP_V = (1<<3), 48 | BG3D_MATERIALFLAG_MULTITEXTURE = (1<<4) 49 | 50 | }; 51 | 52 | 53 | /* TAG TYPES */ 54 | 55 | enum 56 | { 57 | BG3D_TAGTYPE_MATERIALFLAGS, 58 | BG3D_TAGTYPE_MATERIALDIFFUSECOLOR, 59 | BG3D_TAGTYPE_TEXTUREMAP, 60 | BG3D_TAGTYPE_GROUPSTART, 61 | BG3D_TAGTYPE_GROUPEND, 62 | BG3D_TAGTYPE_GEOMETRY, 63 | BG3D_TAGTYPE_VERTEXARRAY, 64 | BG3D_TAGTYPE_NORMALARRAY, 65 | BG3D_TAGTYPE_UVARRAY, 66 | BG3D_TAGTYPE_COLORARRAY, 67 | BG3D_TAGTYPE_TRIANGLEARRAY, 68 | BG3D_TAGTYPE_ENDFILE, 69 | BG3D_TAGTYPE_BOUNDINGBOX 70 | }; 71 | 72 | 73 | typedef struct 74 | { 75 | uint32_t width; // dimensions of texture 76 | uint32_t height; // dimensions of texture 77 | GLint srcPixelFormat; // OGL format (GL_RGBA, etc.) for internal 78 | GLint dstPixelFormat; // format for VRAM 79 | uint32_t bufferSize; // size of texture data to follow 80 | uint32_t reserved[4]; // for future use 81 | }BG3DTextureHeader; 82 | 83 | 84 | /* GEOMETRY TYPES */ 85 | 86 | enum 87 | { 88 | BG3D_GEOMETRYTYPE_VERTEXELEMENTS 89 | 90 | }; 91 | 92 | 93 | /* BG3D GEOMETRY HEADER */ 94 | 95 | typedef struct 96 | { 97 | uint32_t type; // geometry type 98 | int32_t numMaterials; // # material layers 99 | uint32_t layerMaterialNum[MAX_MULTITEXTURE_LAYERS]; // index into material list 100 | uint32_t flags; // flags 101 | uint32_t numPoints; // (if applicable) 102 | uint32_t numTriangles; // (if applicable) 103 | uint32_t reserved[4]; // for future use 104 | }BG3DGeometryHeader; 105 | 106 | 107 | //----------------------------------- 108 | 109 | 110 | void InitBG3DManager(void); 111 | void ImportBG3D(FSSpec *spec, int groupNum); 112 | void DisposeBG3DContainer(int groupNum); 113 | void DisposeAllBG3DContainers(void); 114 | void BG3D_SetContainerMaterialFlags(short group, short type, short geometryNum, uint32_t flags); 115 | void ConvertTexture24To16(uint8_t *srcBuff24, uint16_t *destBuff16, int width, int height); 116 | void BG3D_SphereMapGeomteryMaterial(short group, short type, short geometryNum, uint16_t combineMode, uint16_t envMapNum); 117 | void SetSphereMapInfoOnVertexArrayData(MOVertexArrayData *va, uint16_t combineMode, uint16_t envMapNum); 118 | void SetSphereMapInfoOnVertexArrayObject(MOVertexArrayObject *mo, uint16_t combineMode, uint16_t envMapNum); 119 | void SetSphereMapInfoOnMaterialObject(MOMaterialObject *mat, uint16_t combineMode, uint16_t envMapNum); 120 | -------------------------------------------------------------------------------- /Source/Headers/bones.h: -------------------------------------------------------------------------------- 1 | // 2 | // bone.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | void LoadBonesReferenceModel(FSSpec *inSpec, SkeletonDefType *skeleton, int skeletonType); 9 | extern void UpdateSkinnedGeometry(ObjNode *theNode); 10 | extern void PrimeBoneData(SkeletonDefType *skeleton); 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Source/Headers/camera.h: -------------------------------------------------------------------------------- 1 | // 2 | // camera.h 3 | // 4 | 5 | #pragma once 6 | 7 | void InitCamera_Terrain(void); 8 | void InitCamera_Duel(void); 9 | void UpdateCamera_Duel(void); 10 | 11 | void UpdateCamera_Terrain(void); 12 | void ResetCameraSettings(void); 13 | void DrawLensFlare(void); 14 | 15 | void UpdateCamera_Shootout(void); 16 | 17 | Boolean PrimeStampedeCamera(long splineNum, SplineItemType *itemPtr); 18 | 19 | void InitCamera_TargetPractice(void); 20 | 21 | 22 | void PrepAnaglyphCameras(void); 23 | void RestoreCamerasFromAnaglyph(void); 24 | void CalcAnaglyphCameraOffset(short pass); 25 | -------------------------------------------------------------------------------- /Source/Headers/collision.h: -------------------------------------------------------------------------------- 1 | // 2 | // collision.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | enum 9 | { 10 | COLLISION_TYPE_OBJ, // box 11 | COLLISION_TYPE_TILE 12 | }; 13 | 14 | 15 | 16 | 17 | /* COLLISION STRUCTURES */ 18 | struct CollisionRec 19 | { 20 | Byte baseBox,targetBox; 21 | unsigned short sides; 22 | Byte type; 23 | ObjNode *objectPtr; // object that collides with (if object type) 24 | float planeIntersectY; // where intersected triangle 25 | }; 26 | typedef struct CollisionRec CollisionRec; 27 | 28 | 29 | 30 | //================================= 31 | 32 | void CollisionDetect(ObjNode *baseNode, uint32_t CType, short startNumCollisions); 33 | 34 | Byte HandleCollisions(ObjNode *theNode, uint32_t cType, float deltaBounce); 35 | extern Boolean IsPointInPoly2D( float, float , Byte , OGLPoint2D *); 36 | extern Boolean IsPointInTriangle(float pt_x, float pt_y, float x0, float y0, float x1, float y1, float x2, float y2); 37 | short DoSimplePointCollision(OGLPoint3D *thePoint, uint32_t cType, ObjNode *except); 38 | short DoSimpleBoxCollision(float top, float bottom, float left, float right, 39 | float front, float back, uint32_t cType); 40 | 41 | 42 | 43 | Boolean DoSimplePointCollisionAgainstPlayer(OGLPoint3D *thePoint); 44 | Boolean DoSimpleBoxCollisionAgainstPlayer(float top, float bottom, float left, float right, 45 | float front, float back); 46 | Boolean DoSimpleBoxCollisionAgainstObject(float top, float bottom, float left, float right, 47 | float front, float back, ObjNode *targetNode); 48 | float FindHighestCollisionAtXZ(float x, float z, uint32_t cType); 49 | 50 | Boolean SeeIfLineSegmentHitsAnything(const OGLPoint3D *endPoint1, const OGLPoint3D *endPoint2, 51 | const ObjNode *except, uint32_t ctype); 52 | 53 | Boolean SeeIfLineSegmentHitsObject(const OGLPoint3D *endPoint1, const OGLPoint3D *endPoint2, ObjNode *theNode); 54 | 55 | ObjNode *SeeIfLineSegmentHitsWhat(const OGLPoint3D *endPoint1, const OGLPoint3D *endPoint2, int what); 56 | 57 | -------------------------------------------------------------------------------- /Source/Headers/effects.h: -------------------------------------------------------------------------------- 1 | // 2 | // effects.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | #define MAX_PARTICLE_GROUPS 70 9 | #define MAX_PARTICLES 253 // (note change Byte below if > 255) 10 | 11 | 12 | /* FIRE & SMOKE */ 13 | 14 | #define FireTimer SpecialF[5] 15 | #define SmokeTimer SpecialF[4] 16 | #define SmokeParticleGroup Special[0] 17 | #define SmokeParticleMagic Special[1] 18 | 19 | /* PARTICLE GROUP TYPE */ 20 | 21 | typedef struct 22 | { 23 | uint32_t magicNum; 24 | Byte isUsed[MAX_PARTICLES]; 25 | Byte type; 26 | uint32_t flags; 27 | Byte particleTextureNum; 28 | float gravity; 29 | float magnetism; 30 | float baseScale; 31 | float decayRate; // shrink speed 32 | float fadeRate; 33 | 34 | int srcBlend,dstBlend; 35 | 36 | float alpha[MAX_PARTICLES]; 37 | float scale[MAX_PARTICLES]; 38 | float rotZ[MAX_PARTICLES]; 39 | float rotDZ[MAX_PARTICLES]; 40 | OGLPoint3D coord[MAX_PARTICLES]; 41 | OGLVector3D delta[MAX_PARTICLES]; 42 | short vaporTrail[MAX_PARTICLES]; 43 | 44 | float maxY; 45 | 46 | MOVertexArrayObject *geometryObj; 47 | 48 | }ParticleGroupType; 49 | 50 | 51 | enum 52 | { 53 | PARTICLE_TYPE_FALLINGSPARKS, 54 | PARTICLE_TYPE_GRAVITOIDS 55 | }; 56 | 57 | enum 58 | { 59 | PARTICLE_FLAGS_BOUNCE = (1<<0), 60 | PARTICLE_FLAGS_HURTPLAYER = (1<<1), 61 | PARTICLE_FLAGS_HURTPLAYERBAD = (1<<2), //combine with PARTICLE_FLAGS_HURTPLAYER 62 | PARTICLE_FLAGS_HURTENEMY = (1<<3), 63 | PARTICLE_FLAGS_DONTCHECKGROUND = (1<<4), 64 | PARTICLE_FLAGS_VAPORTRAIL = (1<<5), 65 | PARTICLE_FLAGS_DISPERSEIFBOUNCE = (1<<6), 66 | PARTICLE_FLAGS_ALLAIM = (1<<7), // want to calc look-at matrix for all particles 67 | PARTICLE_FLAGS_HASMAXY = (1<<8) // if particle can only go so high 68 | }; 69 | 70 | 71 | /********** PARTICLE GROUP DEFINITION **************/ 72 | 73 | typedef struct 74 | { 75 | uint32_t magicNum; 76 | Byte type; 77 | uint32_t flags; 78 | float gravity; 79 | float magnetism; 80 | float baseScale; 81 | float decayRate; 82 | float fadeRate; 83 | Byte particleTextureNum; 84 | int srcBlend,dstBlend; 85 | }NewParticleGroupDefType; 86 | 87 | /*************** NEW PARTICLE DEFINITION *****************/ 88 | 89 | typedef struct 90 | { 91 | short groupNum; 92 | OGLPoint3D *where; 93 | OGLVector3D *delta; 94 | float scale; 95 | float rotZ,rotDZ; 96 | float alpha; 97 | }NewParticleDefType; 98 | 99 | 100 | #define FULL_ALPHA 1.0f 101 | 102 | 103 | void InitEffects(void); 104 | void InitParticleSystem(void); 105 | 106 | 107 | void DeleteAllParticleGroups(void); 108 | short NewParticleGroup(NewParticleGroupDefType *def); 109 | Boolean AddParticleToGroup(NewParticleDefType *def); 110 | Boolean VerifyParticleGroupMagicNum(short group, uint32_t magicNum); 111 | Boolean ParticleHitObject(ObjNode *theNode, uint16_t inFlags); 112 | void DisposeParticleSystem(void); 113 | 114 | void MakePuff(const OGLPoint3D *where, float scale, short texNum, GLint src, GLint dst, float decayRate); 115 | void MakeSparkExplosion(float x, float y, float z, float force, float scale, short sparkTexture, short quantityLimit, float fadeRate); 116 | 117 | void MakeBombExplosion(OGLPoint3D *where); 118 | void MakeSplash(float x, float y, float z, float scale); 119 | 120 | void SprayWater(ObjNode *theNode, float x, float y, float z); 121 | void BurnFire(ObjNode *theNode, float x, float y, float z, Boolean doSmoke, short particleType, float scale, uint32_t moreFlags); 122 | 123 | 124 | void MakeFireExplosion(OGLPoint3D *where); 125 | 126 | void MakeSplatter(OGLPoint3D *where, short modelObjType, float scale); 127 | 128 | void MakeSteam(ObjNode *blob, float x, float y, float z); 129 | Boolean AddSmoker(TerrainItemEntryType *itemPtr, float x, float z); 130 | ObjNode *MakeSmoker(float x, float z, int kind); 131 | 132 | void MakeGunBlast(OGLPoint3D *where, OGLVector3D *aim); 133 | void DoBulletImpact(const OGLPoint3D *entryPt, const OGLVector3D *splatVec, float scale); 134 | 135 | Boolean AddFlame(TerrainItemEntryType *itemPtr, float x, float z); 136 | 137 | -------------------------------------------------------------------------------- /Source/Headers/enemy.h: -------------------------------------------------------------------------------- 1 | // 2 | // enemy.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | #include "terrain.h" 9 | #include "splineitems.h" 10 | 11 | 12 | #define DEFAULT_ENEMY_COLLISION_CTYPES (CTYPE_MISC|CTYPE_HURTENEMY|CTYPE_ENEMY|CTYPE_TRIGGER2|CTYPE_FENCE|CTYPE_PLAYER) 13 | #define DEATH_ENEMY_COLLISION_CTYPES (CTYPE_MISC|CTYPE_ENEMY|CTYPE_FENCE) 14 | 15 | #define ENEMY_GRAVITY 3500.0f 16 | #define ENEMY_SLOPE_ACCEL 3000.0f 17 | 18 | 19 | /* ENEMY KIND */ 20 | 21 | enum 22 | { 23 | ENEMY_KIND_BANDITO, 24 | ENEMY_KIND_RYGAR, 25 | ENEMY_KIND_SHORTY, 26 | ENEMY_KIND_TREMORALIEN, 27 | ENEMY_KIND_TREMORGHOST, 28 | ENEMY_KIND_FROGMAN, 29 | NUM_ENEMY_KINDS 30 | }; 31 | 32 | 33 | 34 | enum 35 | { 36 | KANGA_ANIM_STAND = 0, 37 | KANGA_ANIM_STAMPEDE, 38 | KANGA_ANIM_FLAIL 39 | 40 | }; 41 | 42 | 43 | #define StopPoint Special[0] 44 | #define ActionType Special[1] 45 | #define ShootNow Flag[0] 46 | #define EnemyIsDead Flag[4] 47 | 48 | 49 | 50 | //===================================================================== 51 | //===================================================================== 52 | //===================================================================== 53 | 54 | 55 | /* ENEMY */ 56 | 57 | ObjNode *MakeEnemySkeleton(Byte skeletonType, short animNum, float x, float z, float scale, float rot, movecall_t moveCall, uint32_t flags); 58 | extern void DeleteEnemy(ObjNode *theEnemy); 59 | Boolean DoEnemyCollisionDetect(ObjNode *theEnemy, uint32_t ctype, Boolean useBBoxBottom); 60 | void EnemyTouchedPlayer(ObjNode *enemy, ObjNode *player); 61 | extern void UpdateEnemy(ObjNode *theNode); 62 | extern void InitEnemyManager(void); 63 | void DetachEnemyFromSpline(ObjNode *theNode, movecall_t moveCall); 64 | ObjNode *FindClosestEnemy(OGLPoint3D *pt, float *dist); 65 | Boolean IsWaterInFrontOfEnemy(float r); 66 | void GetEnemyHeadCoord(ObjNode *enemy, OGLPoint3D *coord); 67 | void GetEnemyHandCoord(ObjNode *enemy, OGLPoint3D *coord); 68 | void UpdateEnemyAttachments(ObjNode *theNode); 69 | void ShootEnemyBullet(OGLPoint3D *muzzlePt, OGLVector3D *aim); 70 | 71 | void DecEnemiesAtStopPoint(void); 72 | 73 | //========================================================================================== 74 | 75 | /***********/ 76 | /* BANDITO */ 77 | /***********/ 78 | 79 | enum 80 | { 81 | BANDITO_JOINT_CHEST= 1, 82 | BANDITO_JOINT_UPPERSPINE = 2, 83 | BANDITO_JOINT_HEAD = 3, 84 | BANDITO_JOINT_RIGHTHIP = 4, 85 | BANDITO_JOINT_RIGHTSHOULDER = 10, 86 | BANDITO_JOINT_RIGHTHAND = 12, 87 | BANDITO_JOINT_LEFTSHOULDER = 13 88 | }; 89 | 90 | enum 91 | { 92 | BANDITO_ANIM_STANDDUEL = 0, 93 | BANDITO_ANIM_SHOTINCHEST, 94 | BANDITO_ANIM_DRAWANDSHOOT, 95 | BANDITO_ANIM_DUCK, 96 | BANDITO_ANIM_STANDSHOOT, 97 | BANDITO_ANIM_GOTSHOT2 98 | }; 99 | 100 | ObjNode *MakeBandito(float x, float z, float rot, short animNum, movecall_t moveCall, Boolean gunInHand); 101 | void UpdateBanditoAttachments(ObjNode *enemy); 102 | void BanditoPutGunInHand(ObjNode *enemy); 103 | Boolean AddBandito_Shootout(TerrainItemEntryType *itemPtr, float x, float z); 104 | 105 | 106 | //========================================================================================== 107 | 108 | /*********/ 109 | /* RYGAR */ 110 | /*********/ 111 | 112 | enum 113 | { 114 | RYGAR_JOINT_CHEST = 2, 115 | RYGAR_JOINT_HEAD = 4, 116 | RYGAR_JOINT_RIGHTHIP = 5, 117 | RYGAR_JOINT_LEFTHIP = 8, 118 | RYGAR_JOINT_RIGHTSHOULDER = 10, 119 | RYGAR_JOINT_RIGHTHAND = 13, 120 | RYGAR_JOINT_LEFTSHOULDER = 14, 121 | RYGAR_JOINT_LEFTELBOW = 15, 122 | RYGAR_JOINT_LEFTHAND = 17 123 | }; 124 | 125 | enum 126 | { 127 | RYGAR_ANIM_STANDDUEL = 0, 128 | RYGAR_ANIM_DRAWANDSHOOT, 129 | RYGAR_ANIM_SHOTINCHEST 130 | }; 131 | 132 | ObjNode *MakeRygar(float x, float z, float rot, short animNum, movecall_t moveCall, Boolean gunInHand); 133 | void UpdateRygarAttachments(ObjNode *enemy); 134 | void RygarPutGunsInHands(ObjNode *enemy); 135 | 136 | 137 | //========================================================================================== 138 | 139 | /***********/ 140 | /* SHORTY */ 141 | /***********/ 142 | 143 | enum 144 | { 145 | SHORTY_JOINT_CHEST = 2, 146 | SHORTY_JOINT_HEAD = 3, 147 | SHORTY_JOINT_RIGHTSHOULDER = 4, 148 | SHORTY_JOINT_RIGHTHAND = 6, 149 | SHORTY_JOINT_LEFTSHOULDER = 7, 150 | SHORTY_JOINT_RIGHTHIP = 10 151 | }; 152 | 153 | enum 154 | { 155 | SHORTY_ANIM_STANDDUEL = 0, 156 | SHORTY_ANIM_DRAWANDSHOOT, 157 | SHORTY_ANIM_SHOTINCHEST, 158 | SHORTY_ANIM_DUCK, 159 | SHORTY_ANIM_STANDSHOOT, 160 | SHORTY_ANIM_DUCKSHOOTRIGHT, 161 | SHORTY_ANIM_DUCKSHOOTLEFT, 162 | SHORTY_ANIM_TOSSED 163 | }; 164 | 165 | ObjNode *MakeShorty(float x, float z, float rot, short animNum, movecall_t moveCall, Boolean gunInHand); 166 | void UpdateShortyAttachments(ObjNode *enemy); 167 | void ShortyPutGunInHand(ObjNode *enemy); 168 | Boolean AddShorty_Shootout(TerrainItemEntryType *itemPtr, float x, float z); 169 | 170 | 171 | 172 | /****************/ 173 | /* TREMOR ALIEN */ 174 | /****************/ 175 | 176 | ObjNode *MakeTremorAlien(float x, float z, float rot, short animNum, movecall_t moveCall, Boolean gunInHand); 177 | Boolean PrimeTremorAlien(long splineNum, SplineItemType *itemPtr); 178 | Boolean AddTremorAlien_Shootout(TerrainItemEntryType *itemPtr, float x, float z); 179 | void UpdateTremorAlienAttachments(ObjNode *enemy); 180 | 181 | 182 | 183 | /****************/ 184 | /* TREMOR GHOST */ 185 | /****************/ 186 | 187 | enum 188 | { 189 | TREMORGHOST_ANIM_FLOAT, 190 | TREMORGHOST_ANIM_xxx, 191 | TREMORGHOST_ANIM_RISE, 192 | TREMORGHOST_ANIM_ATTACK, 193 | TREMORGHOST_ANIM_GOTHIT, 194 | TREMORGHOST_ANIM_FLAIL 195 | }; 196 | 197 | 198 | Boolean AddTremorGrave(TerrainItemEntryType *itemPtr, float x, float z); 199 | 200 | 201 | /***********/ 202 | /* FROGMAN */ 203 | /***********/ 204 | 205 | enum 206 | { 207 | FROGMAN_ANIM_STAND = 0, 208 | FROGMAN_ANIM_THROW, 209 | FROGMAN_ANIM_SHOTDEAD, 210 | FROGMAN_ANIM_STUNNED, 211 | FROGMAN_ANIM_TARGETPRACTICE 212 | }; 213 | 214 | 215 | 216 | 217 | Boolean AddFrogMan_Shootout(TerrainItemEntryType *itemPtr, float x, float z); 218 | 219 | 220 | 221 | //============================================= 222 | 223 | Boolean PrimeWalker(long splineNum, SplineItemType *itemPtr); 224 | Boolean AddWalker(TerrainItemEntryType *itemPtr, float x, float z); 225 | 226 | 227 | 228 | 229 | 230 | 231 | -------------------------------------------------------------------------------- /Source/Headers/fences.h: -------------------------------------------------------------------------------- 1 | // 2 | // fences.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | #ifndef FENCE_H 9 | #define FENCE_H 10 | 11 | 12 | typedef struct 13 | { 14 | float top,bottom,left,right; 15 | }RectF; 16 | 17 | typedef struct 18 | { 19 | uint16_t type; // type of fence 20 | short numNubs; // # nubs in fence 21 | OGLPoint3D *nubList; // pointer to nub list 22 | OGLBoundingBox bBox; // bounding box of fence area 23 | OGLVector2D *sectionVectors; // for each section/span, this is the vector from nub(n) to nub(n+1) 24 | OGLVector2D *sectionNormals; // for each section/span, this is the perpendicular normal vector 25 | }FenceDefType; 26 | 27 | 28 | //============================================ 29 | 30 | void PrimeFences(void); 31 | Boolean DoFenceCollision(ObjNode *theNode); 32 | void DisposeFences(void); 33 | Boolean SeeIfLineSegmentHitsFence(const OGLPoint3D *endPoint1, const OGLPoint3D *endPoint2, OGLPoint3D *intersect, Boolean *overTop, float *fenceTopY); 34 | 35 | 36 | #endif 37 | 38 | 39 | -------------------------------------------------------------------------------- /Source/Headers/file.h: -------------------------------------------------------------------------------- 1 | // 2 | // file.h 3 | // 4 | 5 | #pragma once 6 | 7 | #define kGameID 'ALMO' 8 | 9 | #define PREFS_FOLDER_NAME "BillyFrontier" 10 | #define PREFS_FILE_NAME "Prefs" 11 | #define SCORES_FILE_NAME "HighScores" 12 | #define SAVE_FILE_NAME "BillySave" 13 | #define PREFS_MAGIC "NewBillyPrefV02" // Bump this when PrefsType changes 14 | #define SCORES_MAGIC "NewBillyScorV01" // Bump this when HighScoreType changes 15 | #define SAVE_MAGIC "NewBillySaveV01" // Bump this when SaveGameType changes 16 | #define MAX_SAVE_FILES 5 17 | 18 | /***********************/ 19 | /* RESOURCE STURCTURES */ 20 | /***********************/ 21 | 22 | /* Hedr */ 23 | 24 | typedef struct 25 | { 26 | int16_t version; // 0xaa.bb 27 | int16_t numAnims; // gNumAnims 28 | int16_t numJoints; // gNumJoints 29 | int16_t num3DMFLimbs; // gNumLimb3DMFLimbs 30 | }SkeletonFile_Header_Type; 31 | 32 | /* Bone resource */ 33 | // 34 | // matches BoneDefinitionType except missing 35 | // point and normals arrays which are stored in other resources. 36 | // Also missing other stuff since arent saved anyway. 37 | 38 | typedef struct 39 | { 40 | int32_t parentBone; // index to previous bone 41 | char name[32]; // text string name for bone 42 | OGLPoint3D coord; // absolute coord (not relative to parent!) 43 | uint16_t numPointsAttachedToBone; // # vertices/points that this bone has 44 | uint16_t numNormalsAttachedToBone; // # vertex normals this bone has 45 | uint32_t reserved[8]; // reserved for future use 46 | }File_BoneDefinitionType; 47 | 48 | 49 | 50 | 51 | /* AnHd */ 52 | 53 | typedef struct 54 | { 55 | Str32 animName; 56 | int16_t numAnimEvents; 57 | }SkeletonFile_AnimHeader_Type; 58 | 59 | 60 | 61 | /* PREFERENCES */ 62 | 63 | typedef struct 64 | { 65 | // Legacy stuff left for source code compat 66 | struct 67 | { 68 | uint8_t anaglyph : 1; 69 | uint8_t anaglyphColor : 1; 70 | }; 71 | 72 | Boolean fullscreen; 73 | Byte antialiasingLevel; 74 | Byte displayNumMinus1; 75 | Byte mouseWheelScrollSpeed; 76 | Boolean invertMouseWheel; 77 | }PrefsType; 78 | 79 | 80 | /* SAVE GAME */ 81 | 82 | typedef struct 83 | { 84 | uint32_t score; 85 | Byte numLives; 86 | Byte duelWonMask; 87 | Byte levelWonMask; 88 | Byte reserved; 89 | }SaveGameType; 90 | 91 | 92 | 93 | //================================================= 94 | 95 | SkeletonDefType *LoadSkeletonFile(short skeletonType); 96 | 97 | void InitPrefsFolder(bool createIt); 98 | OSErr LoadUserDataFile(const char* filename, const char* magic, long payloadLength, Ptr payloadPtr); 99 | OSErr SaveUserDataFile(const char* filename, const char* magic, long payloadLength, Ptr payloadPtr); 100 | OSErr LoadPrefs(void); 101 | void SavePrefs(void); 102 | 103 | void LoadPlayfield(FSSpec *specPtr); 104 | 105 | OSErr SaveGame(int fileSlot); 106 | OSErr DeleteSavedGame(int fileSlot); 107 | OSErr LoadSavedGame(int fileSlot, SaveGameType* saveDataPtr); 108 | void UseSavedGame(const SaveGameType* saveData); 109 | 110 | 111 | void LoadTargetPracticeArt(void); 112 | void LoadDuelArt(void); 113 | void LoadShootoutArt(void); 114 | void LoadStampedeArt(void); 115 | 116 | 117 | Ptr LoadDataFile(const char* path, long* outLength); 118 | char* LoadTextFile(const char* path, long* outLength); 119 | 120 | char* CSVIterator(char** csvCursor, bool* eolOut); 121 | 122 | 123 | -------------------------------------------------------------------------------- /Source/Headers/globals.h: -------------------------------------------------------------------------------- 1 | /****************************/ 2 | /* MY GLOBALS */ 3 | /* (c)2000 Pangea Software */ 4 | /* By Brian Greenstone */ 5 | /****************************/ 6 | 7 | #pragma once 8 | 9 | /* SOME FLOATING POINT HELPERS */ 10 | 11 | #define EPS (0.000001f) // a very small number which is useful for FP compares close to 0 12 | #define IS_ZERO(_x) (fabs(_x) < EPS) 13 | 14 | #define GAME_CLAMP(x, lo, hi) ( (x) < (lo) ? (lo) : ( (x) > (hi) ? (hi) : (x) ) ) 15 | #define GAME_MIN(a, b) ( (a) < (b) ? (a) : (b) ) 16 | #define GAME_MAX(a, b) ( (a) > (b) ? (a) : (b) ) 17 | #define SQUARED(x) ((x)*(x)) 18 | 19 | 20 | 21 | /* CLOSE ENOUGH TO ZERO */ 22 | // 23 | // If float value is close enough to 0, then make it 0 24 | // 25 | 26 | #define CLOSE_ENOUGH_TO_ZERO(theFloat) if (fabs(theFloat) < EPS) theFloat = 0; 27 | 28 | 29 | /*******************/ 30 | /* 2D ARRAY MACROS */ 31 | /*******************/ 32 | 33 | #define Alloc_2d_array(type, array, n, m) \ 34 | { \ 35 | int _i; \ 36 | \ 37 | array = (type **) AllocPtr((long)(n) * sizeof(type *)); \ 38 | if (array == nil) \ 39 | DoFatalAlert("Alloc_2d_array failed!"); \ 40 | array[0] = (type *) AllocPtr((long)(n) * (long)(m) * sizeof(type)); \ 41 | if (array[0] == nil) \ 42 | DoFatalAlert("Alloc_2d_array failed!"); \ 43 | for (_i = 1; _i < (n); _i++) \ 44 | array[_i] = array[_i-1] + (m); \ 45 | } 46 | 47 | 48 | #define Free_2d_array(array) \ 49 | { \ 50 | SafeDisposePtr((Ptr)array[0]); \ 51 | SafeDisposePtr((Ptr)array); \ 52 | array = nil; \ 53 | } 54 | 55 | #define PI ((float)3.1415926535898) 56 | #define PI2 (2.0f*PI) 57 | 58 | 59 | // COLLISION SIDE INFO 60 | //================================= 61 | 62 | #define SIDE_BITS_TOP (1) // %000001 (r/l/b/t) 63 | #define SIDE_BITS_BOTTOM (1<<1) // %000010 64 | #define SIDE_BITS_LEFT (1<<2) // %000100 65 | #define SIDE_BITS_RIGHT (1<<3) // %001000 66 | #define SIDE_BITS_FRONT (1<<4) // %010000 67 | #define SIDE_BITS_BACK (1<<5) // %100000 68 | #define ALL_SOLID_SIDES (SIDE_BITS_TOP|SIDE_BITS_BOTTOM|SIDE_BITS_LEFT|SIDE_BITS_RIGHT|\ 69 | SIDE_BITS_FRONT|SIDE_BITS_BACK) 70 | 71 | 72 | // CBITS (32 BIT VALUES) 73 | //================================== 74 | 75 | enum 76 | { 77 | CBITS_TOP = SIDE_BITS_TOP, 78 | CBITS_BOTTOM = SIDE_BITS_BOTTOM, 79 | CBITS_LEFT = SIDE_BITS_LEFT, 80 | CBITS_RIGHT = SIDE_BITS_RIGHT, 81 | CBITS_FRONT = SIDE_BITS_FRONT, 82 | CBITS_BACK = SIDE_BITS_BACK, 83 | CBITS_ALLSOLID = ALL_SOLID_SIDES, 84 | CBITS_NOTTOP = SIDE_BITS_LEFT|SIDE_BITS_RIGHT|SIDE_BITS_FRONT|SIDE_BITS_BACK, 85 | CBITS_ALWAYSTRIGGER = (1<<6), 86 | CBITS_IMPENETRABLE = (1<<7), // set if object must have high collision priority and cannot be pushed thru this 87 | CBITS_IMPENETRABLE2 = (1<<8) // set with CTYPE_IMPENETRABLE if dont want player to do coord=oldCoord when touched 88 | }; 89 | 90 | 91 | // CTYPES (32 BIT VALUES) 92 | //================================== 93 | 94 | enum 95 | { 96 | CTYPE_PLAYER = 1, // Me 97 | CTYPE_PLAYERONLY = (1<<1), // misc collision that only player can hit 98 | CTYPE_BLOCKRAYS = (1<<2), // for objects we want to block certain ray-intersect checks 99 | CTYPE_TRIGGERENEMYONLY = (1<<3), // Enemy Trigger 100 | CTYPE_TRIGGER = (1<<4), // Trigger 101 | CTYPE_SKELETON = (1<<5), // Skeleton 102 | CTYPE_MISC = (1<<6), // Misc 103 | CTYPE_BLOCKSHADOW = (1<<7), // Shadows go over it 104 | CTYPE_WATER = (1<<8), // if want to do auto water detect with HandleCollisions() 105 | CTYPE_POWERUP = (1<<9), // Powerup 106 | CTYPE_HURTME = (1<<10), // HURT ME 107 | CTYPE_HURTENEMY = (1<<11), // Hurt Enemy 108 | CTYPE_FENCE = (1<<12), // check fences 109 | CTYPE_TERRAIN = (1<<13), // not an attribute, but just a flag passed to HandleCollisions() 110 | CTYPE_PICKUP = (1<<14), // player can pick this up 111 | CTYPE_ENEMY = (1<<15), // enemy 112 | CTYPE_HITENEMYBULLET = (1<<16), // if can be hit by enemy bullet 113 | CTYPE_PICKABLE = (1<<18), // if want to be picked with world ray/line intersect tests 114 | CTYPE_BLOCKCAMERA = (1<<19), // camera goes over this 115 | CTYPE_BULLET = (1<<20), // bullet projectile 116 | CTYPE_MPLATFORM = (1<<21), // set if it's a moving platform 117 | CTYPE_LOOKAT = (1<<22), // set if camera should do "look at" 118 | CTYPE_BUILDING = (1<<23) 119 | }; 120 | 121 | 122 | 123 | // OBJNODE STATUS BITS 124 | //================================== 125 | 126 | enum 127 | { 128 | STATUS_BIT_ONGROUND = 1, // Player is on anything solid (terrain or objnode) 129 | STATUS_BIT_NOTEXTUREWRAP = (1<<1), // dont allow textures to wrap 130 | STATUS_BIT_DONTCULL = (1<<2), // set if don't want to perform custom culling on this object 131 | STATUS_BIT_NOCOLLISION = (1<<3), // set if want collision code to skip testing against this object 132 | STATUS_BIT_NOMOVE = (1<<4), // dont call object's move function 133 | STATUS_BIT_DONTPURGE = (1<<5), // set if don't want object to get deleted when scrolls out of range 134 | STATUS_BIT_HIDDEN = (1<<6), // dont draw object 135 | STATUS_BIT_DOUBLESIDED = (1<<7), // keep both sides 136 | STATUS_BIT_UNDERWATER = (1<<8), // set if underwater 137 | STATUS_BIT_ROTXZY = (1<<9), // set if want to do x->z->y ordered rotation 138 | STATUS_BIT_ISCULLED = (1<<10), // set if culling function deemed it culled 139 | STATUS_BIT_GLOW = (1<<11), // use additive blending for glow effect 140 | STATUS_BIT_ROTYZX = (1<<12), // 141 | STATUS_BIT_NOLIGHTING = (1<<13), // used when want to render object will NULL shading (no lighting) 142 | STATUS_BIT_ALWAYSCULL = (1<<14), // to force a cull-check 143 | STATUS_BIT_CLIPALPHA = (1<<15), // set if want to modify alphafunc 144 | STATUS_BIT_DELETE = (1<<16), // set by a function which cannot actually delete an object but we want to tell system to delete it at its convenience 145 | STATUS_BIT_NOZBUFFER = (1<<17), // set when want to turn off z buffer 146 | STATUS_BIT_NOZWRITES = (1<<18), // set when want to turn off z buffer writes 147 | STATUS_BIT_NOFOG = (1<<19), 148 | STATUS_BIT_AUTOFADE = (1<<20), // calculate fade xparency value for object when rendering 149 | STATUS_BIT_DETACHED = (1<<21), // set if objnode is free-floating and not attached to linked list 150 | STATUS_BIT_ONSPLINE = (1<<22), // if objnode is attached to spline 151 | STATUS_BIT_REVERSESPLINE = (1<<23), // if going reverse direction on spline 152 | STATUS_BIT_SCREENPICKABLE = (1<<24), // set if geometry object can be picked with GL screen picking 153 | STATUS_BIT_AIMATCAMERA = (1<<25), // if need to aim at player's camera (for sprite billboards) 154 | STATUS_BIT_USEALIGNMENTMATRIX = (1<<26), // use AlignmentMatrix instead of Rot x,y,z for object alignment 155 | STATUS_BIT_UVTRANSFORM = (1<<27), // do uv transform on object when drawing 156 | STATUS_BIT_ROTZXY = (1<<28) 157 | }; 158 | 159 | 160 | enum 161 | { 162 | POW_TYPE_STUNPULSE, 163 | POW_TYPE_HEALTH, 164 | POW_TYPE_JUMPJET, 165 | POW_TYPE_FUEL, 166 | POW_TYPE_SUPERNOVA, 167 | POW_TYPE_FREEZE, 168 | POW_TYPE_MAGNET, 169 | POW_TYPE_GROWTH, 170 | POW_TYPE_FLAME, 171 | POW_TYPE_FLARE, 172 | POW_TYPE_DART, 173 | POW_TYPE_FREELIFE, 174 | 175 | NUM_POW_TYPES 176 | }; 177 | 178 | 179 | enum 180 | { 181 | SIDE_LEFT = 0, 182 | SIDE_RIGHT = 1 183 | }; 184 | 185 | 186 | #include "structs.h" 187 | -------------------------------------------------------------------------------- /Source/Headers/infobar.h: -------------------------------------------------------------------------------- 1 | // 2 | // infobar.h 3 | // 4 | 5 | #pragma once 6 | 7 | ObjNode* InitInfobar(void); 8 | 9 | void DrawInfobarSprite(float x, float y, float size, short texNum); 10 | void DrawInfobarSprite2_Centered(float x, float y, float size, short group, short texNum); 11 | void DrawInfobarSprite2(float x, float y, float size, short group, short texNum); 12 | void DrawInfobarSprite3(float x, float y, float size, short texNum); 13 | void Infobar_DrawNumber(int number, float x, float y, float scale, int numDigits, Boolean showLeading); 14 | 15 | void SetInfobarSpriteState(float anaglyphZ); 16 | -------------------------------------------------------------------------------- /Source/Headers/input.h: -------------------------------------------------------------------------------- 1 | // 2 | // input.h 3 | // 4 | 5 | #pragma once 6 | 7 | #define NUM_SUPPORTED_MOUSE_BUTTONS 31 8 | #define NUM_SUPPORTED_MOUSE_BUTTONS_PURESDL (NUM_SUPPORTED_MOUSE_BUTTONS-2) 9 | #define SDL_BUTTON_WHEELUP (NUM_SUPPORTED_MOUSE_BUTTONS-2) // make wheelup look like it's a button 10 | #define SDL_BUTTON_WHEELDOWN (NUM_SUPPORTED_MOUSE_BUTTONS-1) // make wheeldown look like it's a button 11 | 12 | #define MAX_USER_BINDINGS_PER_NEED 2 13 | #define MAX_HARD_BINDINGS_PER_NEED 1 14 | #define MAX_BINDINGS_PER_NEED (MAX_USER_BINDINGS_PER_NEED + MAX_HARD_BINDINGS_PER_NEED) 15 | 16 | #define MAX_LOCAL_PLAYERS 1 17 | 18 | typedef struct 19 | { 20 | int8_t type; 21 | int8_t id; 22 | } PadBinding; 23 | 24 | typedef struct 25 | { 26 | // SDL scancodes 27 | union 28 | { 29 | int16_t key[MAX_BINDINGS_PER_NEED]; 30 | 31 | struct 32 | { 33 | int16_t userKey[MAX_USER_BINDINGS_PER_NEED]; 34 | int16_t hardKey[MAX_HARD_BINDINGS_PER_NEED]; 35 | }; 36 | }; 37 | 38 | // Controller buttons 39 | union 40 | { 41 | PadBinding pad[MAX_BINDINGS_PER_NEED]; 42 | 43 | struct 44 | { 45 | PadBinding userPad[MAX_USER_BINDINGS_PER_NEED]; 46 | PadBinding hardPad[MAX_HARD_BINDINGS_PER_NEED]; 47 | }; 48 | }; 49 | 50 | int8_t mouseButton; 51 | 52 | } InputBinding; 53 | 54 | enum 55 | { 56 | kInputTypeUnbound = 0, 57 | kInputTypeButton, 58 | kInputTypeAxisPlus, 59 | kInputTypeAxisMinus, 60 | }; 61 | 62 | enum 63 | { 64 | kNeed_Shoot, 65 | kNeed_Duck, 66 | kNeed_Reload, 67 | kNeed_Continue, 68 | kNeed_Jump, 69 | kNeed_Left, 70 | kNeed_Right, 71 | NUM_REMAPPABLE_NEEDS, 72 | 73 | kNeed_UIPause = NUM_REMAPPABLE_NEEDS, 74 | kNeed_UIBack, 75 | kNeed_UIConfirm, 76 | kNeed_UIUp, 77 | kNeed_UIDown, 78 | kNeed_UILeft, 79 | kNeed_UIRight, 80 | NUM_CONTROL_NEEDS, 81 | }; 82 | 83 | //============================================================================================ 84 | 85 | void InitInput(void); 86 | void ReadKeyboard(void); 87 | 88 | OGLPoint2D GetLogicalMouseCoord(void); 89 | void GetMousePixelCoord(float *x, float *y); 90 | 91 | void DoSDLMaintenance(void); 92 | Boolean GetKeyState(uint16_t sdlScancode); 93 | Boolean GetNewKeyState(uint16_t sdlScancode); 94 | Boolean GetClickState(int mouseButton); 95 | Boolean GetNewClickState(int mouseButton); 96 | Boolean GetNeedState(int need); 97 | Boolean GetNewNeedState(int need); 98 | Boolean IsCheatKeyComboDown(void); 99 | Boolean UserWantsOut(void); 100 | 101 | void InvalidateAllInputs(void); 102 | -------------------------------------------------------------------------------- /Source/Headers/items.h: -------------------------------------------------------------------------------- 1 | // 2 | // items.h 3 | // 4 | 5 | #pragma once 6 | 7 | void InitItemsManager(void); 8 | void CreateCyclorama(void); 9 | 10 | Boolean AddBuilding(TerrainItemEntryType *itemPtr, float x, float z); 11 | void DrawCyclorama(ObjNode *theNode); 12 | Boolean AddHeadStone(TerrainItemEntryType *itemPtr, float x, float z); 13 | Boolean AddPlant(TerrainItemEntryType *itemPtr, float x, float z); 14 | Boolean AddDuelRockWall(TerrainItemEntryType *itemPtr, float x, float z); 15 | Boolean AddCoffin(TerrainItemEntryType *itemPtr, float x, float z); 16 | Boolean AddBarrel(TerrainItemEntryType *itemPtr, float x, float z); 17 | Boolean AddWoodCrate(TerrainItemEntryType *itemPtr, float x, float z); 18 | Boolean AddHayBale(TerrainItemEntryType *itemPtr, float x, float z); 19 | Boolean AddPost(TerrainItemEntryType *itemPtr, float x, float z); 20 | Boolean AddSceneryKangaCow(TerrainItemEntryType *itemPtr, float x, float z); 21 | 22 | void DefaultBulletHitCallback(ObjNode *bullet, ObjNode *hitObj, const OGLPoint3D *impactPt); 23 | 24 | Boolean AddTable(TerrainItemEntryType *itemPtr, float x, float z); 25 | Boolean AddChair(TerrainItemEntryType *itemPtr, float x, float z); 26 | 27 | Boolean AddDeadTree(TerrainItemEntryType *itemPtr, float x, float z); 28 | Boolean AddRock(TerrainItemEntryType *itemPtr, float x, float z); 29 | Boolean AddElectricFence(TerrainItemEntryType *itemPtr, float x, float z); 30 | Boolean AddTumbleweed(TerrainItemEntryType *itemPtr, float x, float z); 31 | Boolean PrimeTumbleweed(long splineNum, SplineItemType *itemPtr); 32 | 33 | 34 | Boolean AddTeePee(TerrainItemEntryType *itemPtr, float x, float z); 35 | Boolean AddSwampCabin(TerrainItemEntryType *itemPtr, float x, float z); 36 | 37 | Boolean AddSpearSkull(TerrainItemEntryType *itemPtr, float x, float z); 38 | Boolean AddPeso(TerrainItemEntryType *itemPtr, float x, float z); 39 | 40 | Boolean AddFreeLifePOW(TerrainItemEntryType *itemPtr, float x, float z); 41 | -------------------------------------------------------------------------------- /Source/Headers/lzss.h: -------------------------------------------------------------------------------- 1 | // 2 | // lzss.h 3 | 4 | // Externals 5 | #include "game.h" 6 | 7 | size_t LZSS_Decode(short fRefNum, Ptr destPtr, long sourceSize); 8 | 9 | -------------------------------------------------------------------------------- /Source/Headers/main.h: -------------------------------------------------------------------------------- 1 | // 2 | // main.h 3 | // 4 | 5 | #pragma once 6 | 7 | // Externals 8 | #include "game.h" 9 | 10 | #define GAME_FOV 1.0f 11 | 12 | #define MIN_FPS 10 13 | 14 | #define NORMAL_GRAVITY 4500.0f 15 | 16 | 17 | enum 18 | { 19 | AREA_TOWN_DUEL1 = 0, 20 | AREA_TOWN_SHOOTOUT, 21 | 22 | AREA_TOWN_DUEL2, 23 | AREA_TOWN_STAMPEDE, 24 | 25 | AREA_TOWN_DUEL3, 26 | AREA_TARGETPRACTICE1, 27 | 28 | 29 | AREA_SWAMP_DUEL1, 30 | AREA_SWAMP_SHOOTOUT, 31 | 32 | AREA_SWAMP_DUEL2, 33 | AREA_SWAMP_STAMPEDE, 34 | 35 | AREA_SWAMP_DUEL3, 36 | AREA_TARGETPRACTICE2 37 | 38 | }; 39 | 40 | 41 | 42 | #define DuelerNum Special[4] 43 | 44 | #define POINTS_DUEL_BANDIT 150 45 | #define POINTS_PESO 10 46 | #define POINTS_ANIMAL 30 47 | #define POINTS_ORB 75 48 | #define POINTS_SHOOTOUTENEMY 50 49 | 50 | #define NUM_LEVELS 6 51 | 52 | //================================================= 53 | 54 | 55 | /* MAIN */ 56 | 57 | void GameMain(void); 58 | extern void ToolBoxInit(void); 59 | void InitDefaultPrefs(void); 60 | void StartLevelCompletion(float coolDownTimer); 61 | void DefaultDrawCallback(void); 62 | 63 | void MarkLevelWon(int level); 64 | void MarkDuelWon(int duel); 65 | Boolean IsLevelWon(int level); 66 | Boolean IsDuelWon(int duel); 67 | int GetGameCompletionPercent(Byte duelMask, Byte levelMask); 68 | 69 | /* DUEL */ 70 | 71 | enum 72 | { 73 | DUEL_KEY_SEQUENCE_MODE_NONE, 74 | DUEL_KEY_SEQUENCE_MODE_PROCESS, 75 | DUEL_KEY_SEQUENCE_MODE_GOOD, 76 | DUEL_KEY_SEQUENCE_MODE_BAD, 77 | DUEL_KEY_SEQUENCE_MODE_SHRINK 78 | }; 79 | 80 | #define MAX_REFLEX_DOTS 16 81 | #define MAX_DUEL_KEY_SEQUENCE_LENGTH 8 82 | 83 | 84 | void PlayDuel(Byte difficulty); 85 | Boolean AddDueler(TerrainItemEntryType *itemPtr, float x, float z); 86 | void MovePlayer_Duel(ObjNode *player); 87 | ObjNode *GetRandomDueler(void); 88 | 89 | 90 | /* SHOOTOUT */ 91 | 92 | #define MAX_SHIELD 20.0f 93 | 94 | enum 95 | { 96 | SHOOTOUT_MODE_NONE, 97 | SHOOTOUT_MODE_WALK, 98 | SHOOTOUT_MODE_BATTLE, 99 | SHOOTOUT_MODE_PLAYERKILLED 100 | }; 101 | 102 | 103 | enum 104 | { 105 | ACTION_TYPE_DUCKDOWN, 106 | ACTION_TYPE_DUCKLEFT, 107 | ACTION_TYPE_DUCKRIGHT 108 | }; 109 | 110 | 111 | void PlayShootout(void); 112 | void MovePlayer_Shootout(ObjNode *player); 113 | Boolean AddShootoutSaloon(TerrainItemEntryType *itemPtr, float x, float z); 114 | Boolean AddShootoutAlley(TerrainItemEntryType *itemPtr, float x, float z); 115 | void ShootoutPlayerHitByBulletCallback(ObjNode *bullet, ObjNode *player, const OGLPoint3D *impactPt); 116 | void GoToNextStopPoint(void); 117 | 118 | 119 | /* STAMPEDE */ 120 | 121 | #define PLAYER_STAMPEDE_SPEED 850.0f 122 | 123 | void PlayStampede(void); 124 | void MovePlayer_Stampede(ObjNode *player); 125 | Boolean PrimeStampedeKangaCow(long splineNum, SplineItemType *itemPtr); 126 | Boolean PrimeStampedeKangaRex(long splineNum, SplineItemType *itemPtr); 127 | Boolean AddBoost(TerrainItemEntryType *itemPtr, float x, float z); 128 | 129 | 130 | /* TARGET PRACTICE */ 131 | 132 | void PlayTargetPractice(void); 133 | 134 | 135 | /* GAME MAIN */ 136 | 137 | void GameMain(void); 138 | -------------------------------------------------------------------------------- /Source/Headers/metaobjects.h: -------------------------------------------------------------------------------- 1 | // 2 | // metaobjects.h 3 | // 4 | 5 | #pragma once 6 | 7 | #define MO_COOKIE 0xfeedface // set at head of every object for validation 8 | #define MAX_MATERIAL_LAYERS 2 // max multitexture layers 9 | #define MO_MAX_MIPMAPS 6 // max mipmaps per material 10 | 11 | #define SPRITE_SCALE_BASIS_DENOMINATOR 640.0f 12 | 13 | /* OBJECT TYPES */ 14 | enum 15 | { 16 | MO_TYPE_GROUP = 'grup', 17 | MO_TYPE_GEOMETRY = 'geom', 18 | MO_TYPE_MATERIAL = 'matl', 19 | MO_TYPE_MATRIX = 'mtrx', 20 | MO_TYPE_PICTURE = 'pict', 21 | MO_TYPE_SPRITE = 'sprt', 22 | MO_TYPE_PICKID = 'pick' 23 | }; 24 | 25 | /* OBJECT SUBTYPES */ 26 | 27 | enum 28 | { 29 | MO_GEOMETRY_SUBTYPE_VERTEXARRAY = 'vary' 30 | }; 31 | 32 | 33 | /* META OBJECT HEADER */ 34 | // 35 | // This structure is always at the head of any metaobject 36 | // 37 | 38 | struct MetaObjectHeader 39 | { 40 | uint32_t cookie; // this value should always == MO_COOKIE 41 | int32_t refCount; // # times this is referenced 42 | uint32_t type; // object type 43 | uint32_t subType; // object sub-type 44 | void *data; // pointer to meta object's specific data 45 | 46 | struct MetaObjectHeader *prevNode; // ptr to previous node in linked list 47 | struct MetaObjectHeader *nextNode; // ptr to next node in linked list 48 | }; 49 | typedef struct MetaObjectHeader MetaObjectHeader; 50 | 51 | typedef void * MetaObjectPtr; 52 | 53 | 54 | /****************/ 55 | /* GROUP OBJECT */ 56 | /****************/ 57 | 58 | #define MO_MAX_ITEMS_IN_GROUP 70 59 | 60 | typedef struct 61 | { 62 | int numObjectsInGroup; 63 | MetaObjectHeader *groupContents[MO_MAX_ITEMS_IN_GROUP]; 64 | }MOGroupData; 65 | 66 | typedef struct 67 | { 68 | MetaObjectHeader objectHeader; 69 | MOGroupData objectData; 70 | }MOGroupObject; 71 | 72 | 73 | /*******************/ 74 | /* MATERIAL OBJECT */ 75 | /*******************/ 76 | 77 | typedef struct 78 | { 79 | SDL_GLContext drawContext; // materials are draw context relative, so remember which context we're using now 80 | 81 | uint32_t flags; 82 | OGLColorRGBA diffuseColor; // rgba diffuse color 83 | uint16_t multiTextureMode; // sphere map, etc. 84 | uint16_t multiTextureCombine; // blend, replace, etc. 85 | uint16_t envMapNum; // texture # in env map list to use 86 | 87 | uint32_t numMipmaps; // # texture mipmaps to use 88 | uint32_t width,height; // dimensions of texture 89 | GLint pixelSrcFormat; // OGL format (GL_RGBA, etc.) for src pixels 90 | GLint pixelDstFormat; // OGL format (GL_RGBA, etc.) for VRAM 91 | void *texturePixels[MO_MAX_MIPMAPS]; // ptr to texture pixels for each mipmap 92 | GLuint textureName[MO_MAX_MIPMAPS]; // texture name assigned by OpenGL 93 | }MOMaterialData; 94 | 95 | typedef struct 96 | { 97 | MetaObjectHeader objectHeader; 98 | MOMaterialData objectData; 99 | }MOMaterialObject; 100 | 101 | 102 | enum 103 | { 104 | MULTI_TEXTURE_MODE_REFLECTIONSPHERE, 105 | MULTI_TEXTURE_MODE_OBJECT_PLANE 106 | }; 107 | 108 | enum 109 | { 110 | MULTI_TEXTURE_COMBINE_MODULATE, 111 | MULTI_TEXTURE_COMBINE_BLEND, 112 | MULTI_TEXTURE_COMBINE_ADD, 113 | MULTI_TEXTURE_COMBINE_ADDALPHA 114 | }; 115 | 116 | 117 | /********************************/ 118 | /* VERTEX ARRAY GEOMETRY OBJECT */ 119 | /********************************/ 120 | 121 | typedef struct 122 | { 123 | GLuint vertexIndices[3]; 124 | }MOTriangleIndecies; 125 | 126 | typedef struct 127 | { 128 | int numMaterials; // # material layers used in geometry (if negative, then use current texture) 129 | MOMaterialObject *materials[MAX_MATERIAL_LAYERS]; // a reference to a material meta object 130 | 131 | int numPoints; // # vertices in the model 132 | int numTriangles; // # triangls in the model 133 | OGLPoint3D *points; // ptr to array of vertex x,y,z coords 134 | OGLVector3D *normals; // ptr to array of vertex normals 135 | OGLTextureCoord *uvs[MAX_MATERIAL_LAYERS]; // ptr to array of vertex uv's for each layer 136 | OGLColorRGBA_Byte *colorsByte; // ptr to array of vertex colors (byte & float versions) 137 | OGLColorRGBA *colorsFloat; 138 | MOTriangleIndecies *triangles; // ptr to array of triangle triad indecies 139 | 140 | OGLBoundingBox bBox; // local BBox 141 | 142 | }MOVertexArrayData; 143 | 144 | typedef struct 145 | { 146 | MetaObjectHeader objectHeader; 147 | MOVertexArrayData objectData; 148 | }MOVertexArrayObject; 149 | 150 | 151 | 152 | /*****************/ 153 | /* MATRIX OBJECT */ 154 | /*****************/ 155 | 156 | typedef struct 157 | { 158 | MetaObjectHeader objectHeader; 159 | OGLMatrix4x4 matrix; 160 | }MOMatrixObject; 161 | 162 | 163 | /******************/ 164 | /* PICTURE OBJECT */ 165 | /******************/ 166 | 167 | #define PICTURE_FULL_SCREEN_SIZE_X 1024 // use this as scaling reference base 168 | #define PICTURE_FULL_SCREEN_SIZE_Y 768 169 | 170 | 171 | typedef struct 172 | { 173 | OGLPoint3D drawCoord; 174 | float drawScaleX,drawScaleY; 175 | int fullWidth,fullHeight; 176 | MOMaterialObject *material; 177 | }MOPictureData; 178 | 179 | typedef struct 180 | { 181 | MetaObjectHeader objectHeader; 182 | MOPictureData objectData; 183 | }MOPictureObject; 184 | 185 | 186 | /*****************/ 187 | /* SPRITE OBJECT */ 188 | /*****************/ 189 | 190 | typedef struct 191 | { 192 | float width,height; // pixel w/h of texture 193 | float aspectRatio; // h/w 194 | float scaleBasis; 195 | 196 | OGLPoint3D coord; 197 | float scaleX,scaleY; 198 | float rot; 199 | 200 | MOMaterialObject *material; 201 | }MOSpriteData; 202 | 203 | typedef struct 204 | { 205 | MetaObjectHeader objectHeader; 206 | MOSpriteData objectData; 207 | }MOSpriteObject; 208 | 209 | 210 | typedef struct 211 | { 212 | Boolean loadFile; // true if want to create sprite from pict right now, otherwise use from gSpriteList 213 | 214 | FSSpec spec; // picture file to load as sprite 215 | GLint pixelFormat; // format to store loaded sprite as 216 | 217 | short group,type; // group and type of gSpriteList sprite to use 218 | }MOSpriteSetupData; 219 | 220 | 221 | /***************/ 222 | /* PICK OBJECT */ 223 | /***************/ 224 | 225 | typedef struct 226 | { 227 | MetaObjectHeader objectHeader; 228 | uint32_t pickID; 229 | }MOPickIDObject; 230 | 231 | 232 | //----------------------------- 233 | 234 | void MO_InitHandler(void); 235 | MetaObjectPtr MO_CreateNewObjectOfType(uint32_t type, uint32_t subType, const void *data); 236 | MetaObjectPtr MO_GetNewReference(MetaObjectPtr mo); 237 | void MO_AppendToGroup(MOGroupObject *group, MetaObjectPtr newObject); 238 | void MO_AttachToGroupStart(MOGroupObject *group, MetaObjectPtr newObject); 239 | void MO_DrawGeometry_VertexArray(const MOVertexArrayData *data); 240 | void MO_DrawGroup(const MOGroupObject *object); 241 | void MO_DrawObject(const MetaObjectPtr object); 242 | void MO_DrawMaterial(MOMaterialObject *matObj); 243 | void MO_DrawMatrix(const MOMatrixObject *matObj); 244 | void MO_DrawPicture(const MOPictureObject *picObj); 245 | void MO_DisposeObjectReference(MetaObjectPtr obj); 246 | void MO_DuplicateVertexArrayData(MOVertexArrayData *inData, MOVertexArrayData *outData); 247 | void MO_DeleteObjectInfo_Geometry_VertexArray(MOVertexArrayData *data); 248 | void MO_CalcBoundingBox(MetaObjectPtr object, OGLBoundingBox *bBox, OGLMatrix4x4 *m); 249 | 250 | void MO_DrawSprite(const MOSpriteObject *spriteObj); 251 | void MO_VertexArray_OffsetUVs(MetaObjectPtr object, float du, float dv); 252 | void MO_Object_OffsetUVs(MetaObjectPtr object, float du, float dv); 253 | void MO_Geometry_OffserUVs(short group, short type, short geometryNum, float du, float dv); 254 | void MO_CalcBoundingSphere(MetaObjectPtr object, float *bSphere); 255 | -------------------------------------------------------------------------------- /Source/Headers/misc.h: -------------------------------------------------------------------------------- 1 | // 2 | // misc.h 3 | // 4 | 5 | void DoAlert(const char* format, ...); 6 | POMME_NORETURN void DoFatalAlert(const char* format, ...); 7 | void Wait(long); 8 | POMME_NORETURN void CleanQuit(void); 9 | void SetMyRandomSeed(uint32_t seed); 10 | uint32_t MyRandomLong(void); 11 | Handle AllocHandle(long size); 12 | void *AllocPtr(long size); 13 | void *AllocPtrClear(long size); 14 | void *ReallocPtr(void* initialPtr, long newSize); 15 | void SafeDisposePtr(void *ptr); 16 | float RandomFloat(void); 17 | uint16_t RandomRange(uint16_t min, uint16_t max); 18 | void CalcFramesPerSecond(void); 19 | Boolean IsPowerOf2(int num); 20 | float RandomFloat2(void); 21 | void MyFlushEvents(void); 22 | -------------------------------------------------------------------------------- /Source/Headers/miscscreens.h: -------------------------------------------------------------------------------- 1 | // 2 | // miscscreens.h 3 | // 4 | 5 | #pragma once 6 | 7 | #define SCORE_NUM_DIGITS 5 8 | #define SCORE_FMT "%05d" 9 | 10 | 11 | #define DARKEN_PANE_Z 450.0f 12 | 13 | 14 | void DoWarmUpScreen(void); 15 | void DisplayPicture(const char* path); 16 | void DoPaused(void); 17 | 18 | void DoLegalScreen(void); 19 | ObjNode *MakeDarkenPane(void); 20 | 21 | void BuildMainMenu(int); 22 | void DoMainMenuScreen(Byte startMenu); 23 | void MoveBulletHole(ObjNode *theNode); 24 | 25 | 26 | /* BIG BOARD */ 27 | 28 | void DoBigBoardScreen(void); 29 | 30 | 31 | 32 | /* HIGH SCORES */ 33 | 34 | void NewScore(Boolean justShowScores); 35 | void LoadHighScores(void); 36 | void ClearHighScores(void); 37 | 38 | -------------------------------------------------------------------------------- /Source/Headers/mobjtypes.h: -------------------------------------------------------------------------------- 1 | // 2 | // mobjtypes.h 3 | // 4 | 5 | #ifndef __MOBJT 6 | #define __MOBJT 7 | 8 | enum 9 | { 10 | MODEL_GROUP_GLOBAL = 0, 11 | MODEL_GROUP_LEVELSPECIFIC = 1, 12 | MODEL_GROUP_TITLE = 1, 13 | MODEL_GROUP_LEVELINTRO = 2, 14 | MODEL_GROUP_WINNERS = 2, 15 | MODEL_GROUP_BONUS = 2, 16 | MODEL_GROUP_MAINMENU = 2, 17 | MODEL_GROUP_HIGHSCORES = 2, 18 | MODEL_GROUP_LOSESCREEN = 2, 19 | MODEL_GROUP_WINSCREEN = 2, 20 | MODEL_GROUP_BUILDINGS = 3, 21 | 22 | MODEL_GROUP_SKELETONBASE // skeleton files' models are attached here 23 | }; 24 | 25 | 26 | 27 | 28 | /******************* GLOBAL *************************/ 29 | 30 | enum 31 | { 32 | GLOBAL_ObjType_BillyHat = 0, 33 | GLOBAL_ObjType_BillyGun, 34 | 35 | GLOBAL_ObjType_BanditoGun, 36 | GLOBAL_ObjType_BanditoHat, 37 | 38 | GLOBAL_ObjType_RygarGun, 39 | GLOBAL_ObjType_RygarHat, 40 | 41 | GLOBAL_ObjType_ShortyGun, 42 | GLOBAL_ObjType_ShortyHat, 43 | 44 | GLOBAL_ObjType_Tomahawk, 45 | 46 | GLOBAL_ObjType_Bullet, 47 | 48 | GLOBAL_ObjType_Barrel, 49 | GLOBAL_ObjType_BarrelTNT, 50 | GLOBAL_ObjType_FrogBarrel, 51 | 52 | GLOBAL_ObjType_Crate, 53 | GLOBAL_ObjType_CrateStack, 54 | GLOBAL_ObjType_MetalCrate, 55 | GLOBAL_ObjType_MetalCrateStack, 56 | 57 | GLOBAL_ObjType_HayBale, 58 | GLOBAL_ObjType_HayBaleStack, 59 | 60 | GLOBAL_ObjType_CrateDebris0, 61 | GLOBAL_ObjType_CrateDebris1, 62 | GLOBAL_ObjType_CrateDebris2, 63 | GLOBAL_ObjType_CrateDebris3, 64 | GLOBAL_ObjType_CrateDebris4, 65 | GLOBAL_ObjType_CrateDebris5, 66 | GLOBAL_ObjType_CrateDebris6, 67 | GLOBAL_ObjType_CrateDebris7, 68 | GLOBAL_ObjType_CrateDebris8, 69 | GLOBAL_ObjType_CrateDebris9, 70 | 71 | GLOBAL_ObjType_Tumbleweed, 72 | GLOBAL_ObjType_AmmoBoxPOW, 73 | GLOBAL_ObjType_PesoPOW, 74 | GLOBAL_ObjType_FreeLifePOW, 75 | GLOBAL_ObjType_ShieldPOW, 76 | 77 | 78 | GLOBAL_ObjType_WoodPost, 79 | 80 | GLOBAL_ObjType_Shield, 81 | GLOBAL_ObjType_Boost 82 | 83 | }; 84 | 85 | 86 | /******************* TOWN *************************/ 87 | 88 | enum 89 | { 90 | TOWN_ObjType_Cyc = 0, 91 | 92 | TOWN_ObjType_Headstone1, 93 | TOWN_ObjType_Headstone2, 94 | TOWN_ObjType_Headstone3, 95 | TOWN_ObjType_Headstone4, 96 | TOWN_ObjType_Headstone5, 97 | 98 | TOWN_ObjType_Cactus, 99 | TOWN_ObjType_DeadTree, 100 | TOWN_ObjType_DeadTreeOnSide, 101 | 102 | TOWN_ObjType_RockWall, 103 | 104 | TOWN_ObjType_Coffin, 105 | TOWN_ObjType_CoffinStack, 106 | 107 | TOWN_ObjType_TallRock1, 108 | TOWN_ObjType_TallRock2, 109 | TOWN_ObjType_ShortRock1, 110 | TOWN_ObjType_ShortRock2, 111 | 112 | TOWN_ObjType_Alley, 113 | 114 | TOWN_ObjType_Table, 115 | TOWN_ObjType_Chair, 116 | 117 | TOWN_ObjType_WalkerPodLeft, 118 | TOWN_ObjType_WalkerPodRight, 119 | TOWN_ObjType_Missile 120 | 121 | 122 | }; 123 | 124 | 125 | /******************* SWAMP *************************/ 126 | 127 | enum 128 | { 129 | SWAMP_ObjType_Cyc = 0, 130 | SWAMP_ObjType_Cabin, 131 | 132 | SWAMP_ObjType_LargeRock, 133 | SWAMP_ObjType_MediumRock, 134 | SWAMP_ObjType_SmallRock, 135 | SWAMP_ObjType_TallRock, 136 | SWAMP_ObjType_Mound, 137 | 138 | SWAMP_ObjType_MushroomTree, 139 | SWAMP_ObjType_StickTree, 140 | SWAMP_ObjType_Plant1, 141 | SWAMP_ObjType_Plant2, 142 | 143 | SWAMP_ObjType_Grave, 144 | SWAMP_ObjType_TeePee, 145 | 146 | SWAMP_ObjType_SpearSkull, 147 | 148 | SWAMP_ObjType_ElectricFence 149 | 150 | }; 151 | 152 | 153 | 154 | /******************* TARGET PRACTICE *************************/ 155 | 156 | enum 157 | { 158 | PRACTICE_ObjType_CycTown = 0, 159 | PRACTICE_ObjType_CycSwamp, 160 | 161 | PRACTICE_ObjType_Orb_TNT, 162 | PRACTICE_ObjType_Orb_Points, 163 | PRACTICE_ObjType_Orb_Time, 164 | PRACTICE_ObjType_Orb_RapidFire, 165 | PRACTICE_ObjType_DeathSkull, 166 | PRACTICE_ObjType_Bottle 167 | }; 168 | 169 | /******************* BUILDINGS *************************/ 170 | 171 | enum 172 | { 173 | BUILDING_ObjType_Saloon, 174 | BUILDING_ObjType_Express, 175 | BUILDING_ObjType_Jailhouse, 176 | BUILDING_ObjType_Undertaker, 177 | BUILDING_ObjType_Livery, 178 | BUILDING_ObjType_Blacksmith, 179 | BUILDING_ObjType_Bank, 180 | BUILDING_ObjType_Cantina, 181 | 182 | BUILDING_ObjType_Saloon_Burning, 183 | BUILDING_ObjType_Express_Burning, 184 | BUILDING_ObjType_Jailhouse_Burning, 185 | BUILDING_ObjType_Undertaker_Burning, 186 | BUILDING_ObjType_Livery_Burning, 187 | BUILDING_ObjType_Blacksmith_Burning, 188 | BUILDING_ObjType_Bank_Burning, 189 | BUILDING_ObjType_Cantina_Burning, 190 | 191 | BUILDING_ObjType_SaloonInside 192 | }; 193 | 194 | #endif 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | -------------------------------------------------------------------------------- /Source/Headers/modescreen.h: -------------------------------------------------------------------------------- 1 | // 2 | // modescreen.h 3 | // 4 | 5 | //Externals 6 | #include "game.h" 7 | 8 | Boolean DoGameModeScreen(void); 9 | -------------------------------------------------------------------------------- /Source/Headers/objects.h: -------------------------------------------------------------------------------- 1 | // 2 | // Object.h 3 | // 4 | 5 | #pragma once 6 | 7 | #define INVALID_NODE_FLAG 0xdeadbeef // put into CType when node is deleted 8 | 9 | #define TERRAIN_SLOT 1 10 | #define FENCE_SLOT 20 11 | #define PLAYER_SLOT 200 12 | #define ENEMY_SLOT (PLAYER_SLOT+10) 13 | #define SLOT_OF_DUMB 3000 14 | #define SPRITE_SLOT (SLOT_OF_DUMB+100) 15 | #define FADEPANE_SLOT (SLOT_OF_DUMB+1000) 16 | #define PARTICLE_SLOT (SPRITE_SLOT-2) 17 | #define WATER_SLOT (PARTICLE_SLOT - 1) 18 | 19 | enum 20 | { 21 | SKELETON_GENRE, 22 | DISPLAY_GROUP_GENRE, 23 | SPRITE_GENRE, 24 | CUSTOM_GENRE, 25 | EVENT_GENRE, 26 | FONTSTRING_GENRE 27 | }; 28 | 29 | 30 | enum 31 | { 32 | SHADOW_TYPE_CIRCULAR, 33 | }; 34 | 35 | 36 | enum 37 | { 38 | WHAT_UNDEFINED = 0, 39 | 40 | WHAT_PLAYERBULLET, 41 | WHAT_ENEMYBULLET, 42 | 43 | WHAT_COINORB, 44 | WHAT_TIMEORB, 45 | WHAT_RAPIDFIRE, 46 | WHAT_SKULL, 47 | WHAT_KANGACOW, 48 | WHAT_SHORTY, 49 | WHAT_AMMOBOX, 50 | WHAT_FROGMAN, 51 | WHAT_TREMORGHOST, 52 | WHAT_BOTTLE, 53 | WHAT_TNT, 54 | WHAT_PEPPER 55 | }; 56 | 57 | 58 | #define DEFAULT_GRAVITY 5000.0f 59 | 60 | 61 | #define ShadowScaleX SpecialF[0] 62 | #define ShadowScaleZ SpecialF[1] 63 | #define CheckForBlockers Flag[0] 64 | 65 | //======================================================== 66 | 67 | extern void InitObjectManager(void); 68 | extern ObjNode *MakeNewObject(NewObjectDefinitionType *newObjDef); 69 | extern void MoveObjects(void); 70 | void DrawObjects(void); 71 | 72 | extern void DeleteAllObjects(void); 73 | extern void DeleteObject(ObjNode *theNode); 74 | void DetachObject(ObjNode *theNode, Boolean subrecurse); 75 | extern void GetObjectInfo(ObjNode *theNode); 76 | extern void UpdateObject(ObjNode *theNode); 77 | extern ObjNode *MakeNewDisplayGroupObject(NewObjectDefinitionType *newObjDef); 78 | extern void AttachGeometryToDisplayGroupObject(ObjNode *theNode, MetaObjectPtr geometry); 79 | extern void CreateBaseGroup(ObjNode *theNode); 80 | extern void UpdateObjectTransforms(ObjNode *theNode); 81 | extern void SetObjectTransformMatrix(ObjNode *theNode); 82 | extern void DisposeObjectBaseGroup(ObjNode *theNode); 83 | extern void ResetDisplayGroupObject(ObjNode *theNode); 84 | void AttachObject(ObjNode *theNode, Boolean recurse); 85 | 86 | void MoveStaticObject(ObjNode *theNode); 87 | void MoveStaticObject2(ObjNode *theNode); 88 | void MoveStaticObject3(ObjNode *theNode); 89 | void HideObject(ObjNode *theNode); 90 | void ShowObject(ObjNode *theNode); 91 | 92 | void CalcNewTargetOffsets(ObjNode *theNode, float scale); 93 | void CalcObjectRadiusFromBBox(ObjNode *theNode); 94 | 95 | //=================== 96 | 97 | 98 | extern void CalcObjectBoxFromNode(ObjNode *theNode); 99 | extern void CalcObjectBoxFromGlobal(ObjNode *theNode); 100 | void SetObjectCollisionBounds(ObjNode *theNode, float top, float bottom, float left, 101 | float right, float front, float back); 102 | ObjNode *AttachStaticShadowToObject(ObjNode *theNode, int shadowType, float scaleX, float scaleZ); 103 | extern void UpdateShadow(ObjNode *theNode); 104 | extern void CullTestAllObjects(void); 105 | ObjNode *AttachShadowToObject(ObjNode *theNode, int shadowType, float scaleX, float scaleZ, Boolean checkBlockers); 106 | void CreateCollisionBoxFromBoundingBox(ObjNode *theNode, float tweakXZ, float tweakY); 107 | void CreateCollisionBoxFromBoundingBox_Maximized(ObjNode *theNode); 108 | void CreateCollisionBoxFromBoundingBox_Rotated(ObjNode *theNode, float tweakXZ, float tweakY); 109 | void CreateCollisionBoxFromBoundingBox_Update(ObjNode *theNode, float tweakXZ, float tweakY); 110 | ObjNode *FindClosestCType(OGLPoint3D *pt, uint32_t ctype, Boolean notThruSolid); 111 | ObjNode *FindClosestCType3D(OGLPoint3D *pt, uint32_t ctype); 112 | extern void KeepOldCollisionBoxes(ObjNode *theNode); 113 | void AddCollisionBoxToObject(ObjNode *theNode, float top, float bottom, float left, 114 | float right, float front, float back); 115 | void DoObjectFriction(ObjNode *theNode, float friction); 116 | 117 | void CalcDisplayGroupWorldPoints(ObjNode *theNode); 118 | 119 | 120 | ObjNode* MakeBackgroundPictureObject(const char* path); 121 | -------------------------------------------------------------------------------- /Source/Headers/objtypes.h: -------------------------------------------------------------------------------- 1 | // 2 | // objtypes.h 3 | // 4 | 5 | enum 6 | { 7 | SPRITE_GROUP_INFOBAR = 0 8 | }; 9 | 10 | 11 | /******************* INFOBAR *************************/ 12 | 13 | 14 | enum 15 | { 16 | INFOBAR_FRAMENUM_BLASTER, 17 | INFOBAR_FRAMENUM_HEATSEEK, 18 | INFOBAR_FRAMENUM_SONICSCREAM, 19 | INFOBAR_FRAMENUM_TRIBLAST, 20 | INFOBAR_FRAMENUM_NUKE, 21 | 22 | INFOBAR_FRAMENUM_0, 23 | INFOBAR_FRAMENUM_1, 24 | INFOBAR_FRAMENUM_2, 25 | INFOBAR_FRAMENUM_3, 26 | INFOBAR_FRAMENUM_4, 27 | INFOBAR_FRAMENUM_5, 28 | INFOBAR_FRAMENUM_6, 29 | INFOBAR_FRAMENUM_7, 30 | INFOBAR_FRAMENUM_8, 31 | INFOBAR_FRAMENUM_9, 32 | INFOBAR_FRAMENUM_BLANKCHAR, 33 | 34 | INFOBAR_FRAMENUM_FUELGAUGE, 35 | 36 | INFOBAR_FRAMENUM_EGGICON = 45 37 | 38 | 39 | }; 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /Source/Headers/ogl_functions.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | extern PFNGLACTIVETEXTUREARBPROC procptr_glActiveTextureARB; 6 | extern PFNGLCLIENTACTIVETEXTUREARBPROC procptr_glClientActiveTextureARB; 7 | 8 | #define glActiveTextureARB procptr_glActiveTextureARB 9 | #define glClientActiveTextureARB procptr_glClientActiveTextureARB 10 | 11 | void OGL_InitFunctions(void); 12 | -------------------------------------------------------------------------------- /Source/Headers/ogl_support.h: -------------------------------------------------------------------------------- 1 | // 2 | // ogl_support.h 3 | // 4 | 5 | #pragma once 6 | 7 | #define MAX_FILL_LIGHTS 4 8 | #define MAX_TEXTURES 300 9 | 10 | 11 | #define USE_GL_COLOR_MATERIAL 1 12 | 13 | #define SetColor4fv(colorVV) \ 14 | { \ 15 | if (USE_GL_COLOR_MATERIAL) \ 16 | { \ 17 | glColor4fv(&colorVV.r); /* set current diffuse color */ \ 18 | } \ 19 | else \ 20 | { \ 21 | glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, &colorVV.r); \ 22 | } \ 23 | } 24 | 25 | #define SetColor4f(r, g, b, a) \ 26 | { \ 27 | if (USE_GL_COLOR_MATERIAL) \ 28 | { \ 29 | glColor4f(r, g, b, a); \ 30 | glEnable(GL_COLOR_MATERIAL); \ 31 | } \ 32 | else \ 33 | { \ 34 | GLfloat c[4]; \ 35 | c[0] = r; c[1] = g; c[2] = b; c[3] = a; \ 36 | glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c); \ 37 | } \ 38 | } 39 | 40 | #define OGLIsZero(a) (((a) >= -EPS) && ((a) <= EPS)) 41 | 42 | 43 | 44 | /* 4x4 MATRIX INDECIES */ 45 | enum 46 | { 47 | M00 = 0, 48 | M10, 49 | M20, 50 | M30, 51 | M01, 52 | M11, 53 | M21, 54 | M31, 55 | M02, 56 | M12, 57 | M22, 58 | M32, 59 | M03, 60 | M13, 61 | M23, 62 | M33 63 | }; 64 | 65 | /* 3x3 MATRIX INDECIES */ 66 | enum 67 | { 68 | N00 = 0, 69 | N10, 70 | N20, 71 | N01, 72 | N11, 73 | N21, 74 | N02, 75 | N12, 76 | N22 77 | }; 78 | 79 | 80 | /* 3D STRUCTURES */ 81 | 82 | typedef struct 83 | { 84 | float x,y,z,w; 85 | }OGLPoint4D; 86 | 87 | typedef struct 88 | { 89 | GLfloat x,y,z; 90 | }OGLPoint3D; 91 | 92 | typedef struct 93 | { 94 | GLfloat x,y; 95 | }OGLPoint2D; 96 | 97 | typedef struct 98 | { 99 | GLfloat x,y,z; 100 | }OGLVector3D; 101 | 102 | typedef struct 103 | { 104 | GLfloat x,y; 105 | }OGLVector2D; 106 | 107 | typedef struct 108 | { 109 | GLfloat u,v; 110 | }OGLTextureCoord; 111 | 112 | typedef struct 113 | { 114 | GLfloat r,g,b; 115 | }OGLColorRGB; 116 | 117 | typedef struct 118 | { 119 | GLfloat r,g,b,a; 120 | }OGLColorRGBA; 121 | 122 | typedef struct 123 | { 124 | GLubyte r,g,b,a; 125 | }OGLColorRGBA_Byte; 126 | 127 | typedef struct 128 | { 129 | GLfloat value[16]; 130 | }OGLMatrix4x4; 131 | 132 | typedef struct 133 | { 134 | GLfloat value[9]; 135 | }OGLMatrix3x3; 136 | 137 | typedef struct 138 | { 139 | OGLVector3D normal; 140 | float constant; 141 | }OGLPlaneEquation; 142 | 143 | typedef struct 144 | { 145 | OGLPoint3D point; 146 | OGLTextureCoord uv; 147 | OGLColorRGBA color; 148 | }OGLVertex; 149 | 150 | typedef struct 151 | { 152 | OGLPoint3D origin; 153 | OGLVector3D direction; 154 | float distance; 155 | }OGLRay; 156 | 157 | typedef struct 158 | { 159 | OGLPoint3D cameraLocation; /* Location point of the camera */ 160 | OGLPoint3D pointOfInterest; /* Point of interest */ 161 | OGLVector3D upVector; /* "up" vector */ 162 | }OGLCameraPlacement; 163 | 164 | typedef struct 165 | { 166 | OGLPoint3D min; 167 | OGLPoint3D max; 168 | Boolean isEmpty; 169 | uint8_t reserved[3]; // file padding 170 | }OGLBoundingBox; 171 | 172 | 173 | typedef struct 174 | { 175 | OGLPoint3D origin; 176 | float radius; 177 | Boolean isEmpty; 178 | }OGLBoundingSphere; 179 | 180 | 181 | typedef struct 182 | { 183 | float top,bottom,left,right; 184 | }OGLRect; 185 | 186 | //======================== 187 | 188 | typedef struct 189 | { 190 | Boolean clearBackBuffer; 191 | OGLColorRGBA clearColor; 192 | Rect clip; // left = amount to clip off left, etc. 193 | }OGLViewDefType; 194 | 195 | 196 | typedef struct 197 | { 198 | Boolean useFog; 199 | float fogStart; 200 | float fogEnd; 201 | float fogDensity; 202 | short fogMode; 203 | 204 | }OGLStyleDefType; 205 | 206 | 207 | typedef struct 208 | { 209 | OGLPoint3D from; 210 | OGLPoint3D to; 211 | OGLVector3D up; 212 | float hither; 213 | float yon; 214 | float fov; 215 | }OGLCameraDefType; 216 | 217 | typedef struct 218 | { 219 | OGLColorRGBA ambientColor; 220 | int numFillLights; 221 | OGLVector3D fillDirection[MAX_FILL_LIGHTS]; 222 | OGLColorRGBA fillColor[MAX_FILL_LIGHTS]; 223 | }OGLLightDefType; 224 | 225 | 226 | /* OGLSetupInputType */ 227 | 228 | typedef struct 229 | { 230 | OGLViewDefType view; 231 | OGLStyleDefType styles; 232 | OGLCameraDefType camera; 233 | OGLLightDefType lights; 234 | }OGLSetupInputType; 235 | 236 | 237 | /* OGLSetupOutputType */ 238 | 239 | typedef struct 240 | { 241 | Boolean isActive; 242 | // SDL_GLContext drawContext; 243 | Rect clip; // not pane size, but clip: left = amount to clip off left 244 | OGLLightDefType lightList; 245 | OGLCameraPlacement cameraPlacement; 246 | float fov,hither,yon; 247 | Boolean useFog; 248 | Boolean clearBackBuffer; 249 | }OGLSetupOutputType; 250 | 251 | 252 | extern float gAnaglyphFocallength,gAnaglyphEyeSeparation; 253 | extern Byte gAnaglyphPass; 254 | 255 | 256 | //===================================================================== 257 | 258 | void OGL_Boot(void); 259 | void OGL_Shutdown(void); 260 | void OGL_NewViewDef(OGLSetupInputType *viewDef); 261 | void OGL_SetupWindow(OGLSetupInputType *setupDefPtr); 262 | void OGL_DisposeWindowSetup(void); 263 | void OGL_DrawScene(void (*drawRoutine)(void)); 264 | void OGL_Camera_SetPlacementAndUpdateMatrices(void); 265 | void OGL_MoveCameraFromTo(float fromDX, float fromDY, float fromDZ, float toDX, float toDY, float toDZ); 266 | void OGL_MoveCameraFrom(float fromDX, float fromDY, float fromDZ); 267 | void OGL_UpdateCameraFromToUp(const OGLPoint3D *from, const OGLPoint3D *to, const OGLVector3D *up); 268 | void OGL_UpdateCameraFromTo(const OGLPoint3D *from, const OGLPoint3D *to); 269 | void OGL_Texture_SetOpenGLTexture(GLuint textureName); 270 | GLuint OGL_TextureMap_Load(void *imageMemory, int width, int height, 271 | GLint srcFormat, GLint destFormat, GLint dataType); 272 | GLuint OGL_TextureMap_LoadImageFile(const char* path, int* width, int* height); 273 | GLenum _OGL_CheckError(const char* file, int line); 274 | #define OGL_CheckError() _OGL_CheckError(__FILE__, __LINE__) 275 | void OGL_GetCurrentViewport(int *x, int *y, int *w, int *h); 276 | 277 | void OGL_PushState(void); 278 | void OGL_PopState(void); 279 | 280 | void OGL_EnableLighting(void); 281 | void OGL_DisableLighting(void); 282 | 283 | void OGL_DrawString(const char* s, GLint x, GLint y); 284 | void OGL_DrawFloat(float f, GLint x, GLint y); 285 | void OGL_DrawInt(int f, GLint x, GLint y); 286 | 287 | void OGL_Ortho2DLogicalSize(void); 288 | OGLPoint2D WindowPointToLogical(OGLPoint2D windowPoint); 289 | OGLPoint2D LogicalPointToWindow(OGLPoint2D logicalPoint); 290 | -------------------------------------------------------------------------------- /Source/Headers/pick.h: -------------------------------------------------------------------------------- 1 | // 2 | // pick.h 3 | // 4 | 5 | #pragma once 6 | 7 | Boolean OGLPoint3D_InsideTriangle3D(const OGLPoint3D *point3D, const OGLPoint3D *trianglePoints, const OGLVector3D *triangleNormal); 8 | 9 | Boolean OGL_DoesLineSegmentIntersectSphere(OGLPoint3D *p1, OGLPoint3D *p2, OGLVector3D *segVector, OGLPoint3D *sphereCenter, float sphereRadius, OGLPoint3D *intersectPt); 10 | 11 | ObjNode *OGL_DoRayCollision(OGLRay *ray, OGLPoint3D *worldHitCoord, uint32_t statusFilter, uint32_t cTypes); 12 | 13 | void OGL_GetWorldRayAtScreenPoint(OGLPoint2D *screenCoord, OGLRay *ray); 14 | Boolean OGL_RayIntersectsTriangle(OGLPoint3D *trianglePoints, OGLRay *ray, OGLPoint3D *intersectPt); 15 | 16 | ObjNode *OGL_DoLineSegmentCollision(OGLPoint3D *p1, OGLPoint3D *p2, OGLPoint3D *worldHitCoord, OGLVector3D *worldHitFaceNormal, uint32_t cTypes); 17 | 18 | Boolean OGL_DoesRayIntersectTrianglePlane(const OGLPoint3D triWorldPoints[], OGLRay *ray, OGLPlaneEquation *planeEquation); 19 | -------------------------------------------------------------------------------- /Source/Headers/player.h: -------------------------------------------------------------------------------- 1 | // 2 | // player.h 3 | // 4 | 5 | #ifndef __PLAYER_H__ 6 | #define __PLAYER_H__ 7 | 8 | // Externals 9 | //#include 10 | #include "game.h" 11 | 12 | #define MAX_BUDDY_BUGS 10 13 | 14 | #define PLAYER_DEFAULT_SCALE 1.3f 15 | #define DEFAULT_PLAYER_SHADOW_SCALE 3.0f 16 | 17 | 18 | #define PLAYER_COLLISION_CTYPE (CTYPE_MISC|CTYPE_TRIGGER|CTYPE_FENCE|CTYPE_ENEMY|CTYPE_HURTME|CTYPE_PLAYERONLY) 19 | 20 | #define PLAYER_NORMAL_MAX_SPEED 700.0f 21 | #define MAX_RAMMING_SPEED (PLAYER_NORMAL_MAX_SPEED * 2.0f) 22 | #define PLAYER_PUSH_MAX_SPEED 200.0f 23 | 24 | 25 | #define AMMO_CLIP_SIZE 6 // # bullets in a clip 26 | 27 | 28 | enum 29 | { 30 | PLAYER_DEATH_TYPE_TRAMPLED 31 | }; 32 | 33 | 34 | /* EXPLORE ANIMS */ 35 | 36 | enum 37 | { 38 | PLAYER_ANIM_STAND, 39 | PLAYER_ANIM_WALK, 40 | PLAYER_ANIM_DRAWSHOOT, 41 | PLAYER_ANIM_SHOTINCHEST, 42 | PLAYER_ANIM_DRAWSHOOT2, 43 | PLAYER_ANIM_RUN, 44 | PLAYER_ANIM_STAMPEDESTART, 45 | PLAYER_ANIM_STAMPEDEJUMP, 46 | PLAYER_ANIM_STAMPEDETRAMPLED, 47 | PLAYER_ANIM_DRAWSHOOT3, 48 | PLAYER_ANIM_TRIPPED, 49 | PLAYER_ANIM_DUCK, 50 | PLAYER_ANIM_DRAWSHOOT4, 51 | PLAYER_ANIM_STUNNED 52 | }; 53 | 54 | 55 | 56 | 57 | enum 58 | { 59 | PLAYER_JOINT_BASE = 0, 60 | PLAYER_JOINT_UPPERBACK = 2, 61 | PLAYER_JOINT_HEAD = 3, 62 | PLAYER_JOINT_LEFTHIP = 4, 63 | PLAYER_JOINT_RIGHTHIP = 7, 64 | PLAYER_JOINT_LEFTHAND = 12, 65 | PLAYER_JOINT_RIGHTHAND = 15 66 | }; 67 | 68 | 69 | 70 | /***************/ 71 | /* PLAYER INFO */ 72 | /***************/ 73 | 74 | typedef struct 75 | { 76 | float startX,startZ; 77 | float startRotY; 78 | 79 | OGLPoint3D coord; 80 | ObjNode *objNode; 81 | 82 | float distToFloor; 83 | float mostRecentFloorY; 84 | 85 | float knockDownTimer; 86 | float invincibilityTimer; 87 | 88 | float shieldPower; 89 | ObjNode *shieldObj[2]; 90 | float shieldAlpha; 91 | short shieldChannel; 92 | 93 | int ammoCount; 94 | 95 | OGLRect itemDeleteWindow; 96 | 97 | OGLCameraPlacement camera; 98 | 99 | 100 | /* TILE ATTRIBUTE PHYSICS TWEAKS */ 101 | 102 | 103 | float groundTraction; 104 | float groundFriction; 105 | float groundAcceleration; 106 | 107 | int waterPatch; 108 | 109 | /* INVENTORY INFO */ 110 | 111 | SInt8 lives; 112 | int pesos; 113 | 114 | 115 | }PlayerInfoType; 116 | 117 | 118 | 119 | 120 | //======================================================= 121 | 122 | void InitPlayerInfo_Game(void); 123 | void InitPlayerForDuel(void); 124 | void InitPlayerForShootout(void); 125 | void InitPlayerForStampede(void); 126 | void InitPlayerGlobals(void); 127 | 128 | void KillPlayer(Byte deathType); 129 | Boolean IsPlayerDoingWalkAnim(ObjNode *theNode); 130 | Boolean IsPlayerDoingStandAnim(ObjNode *theNode); 131 | void UpdatePlayerShield(void); 132 | void PingShield(float damage); 133 | 134 | 135 | ObjNode *CreateBilly(OGLPoint3D *where, float rotY); 136 | void SetPlayerStandAnim(ObjNode *theNode, float speed); 137 | void SetPlayerWalkAnim(ObjNode *theNode); 138 | 139 | /* BILLY */ 140 | 141 | void UpdateBillyAttachments(ObjNode *player); 142 | void UpdateBilly(ObjNode *theNode); 143 | Boolean DoBillyCollisionDetect(ObjNode *theNode, Boolean useBBoxForTerrain); 144 | void BillyPutGunsInHands(ObjNode *player); 145 | void CalcGunMatrixFromJointMatrix(ObjNode *gun, OGLMatrix4x4 *jointMatrix, OGLMatrix4x4 *gunMatrix); 146 | 147 | 148 | 149 | #endif -------------------------------------------------------------------------------- /Source/Headers/shards.h: -------------------------------------------------------------------------------- 1 | // 2 | // shards.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | enum 9 | { 10 | SHARD_MODE_UPTHRUST = 1, 11 | SHARD_MODE_HEAVYGRAVITY = (1<<1), 12 | SHARD_MODE_BOUNCE = (1<<2), 13 | SHARD_MODE_FROMORIGIN = (1<<3) 14 | 15 | }; 16 | 17 | 18 | 19 | void InitShardSystem(void); 20 | void ExplodeGeometry(ObjNode *theNode, float boomForce, Byte particleMode, long particleDensity, float particleDecaySpeed); 21 | void MoveShards(ObjNode *theNode); 22 | void DrawShards(ObjNode *theNode); 23 | 24 | 25 | -------------------------------------------------------------------------------- /Source/Headers/skeletonanim.h: -------------------------------------------------------------------------------- 1 | // 2 | // anim.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | /* ANIM EVENTS */ 9 | 10 | #define MAX_ANIM_EVENTS 30 11 | 12 | #define MAX_ANIMEVENT_TYPES 7 13 | 14 | enum 15 | { 16 | ANIM_DIRECTION_FORWARD, 17 | ANIM_DIRECTION_BACKWARD 18 | }; 19 | 20 | 21 | enum 22 | { 23 | ANIMEVENT_TYPE_STOP, 24 | ANIMEVENT_TYPE_LOOP, 25 | ANIMEVENT_TYPE_ZIGZAG, 26 | ANIMEVENT_TYPE_GOTOMARKER, 27 | ANIMEVENT_TYPE_SETMARKER, 28 | ANIMEVENT_TYPE_PLAYSOUND, 29 | ANIMEVENT_TYPE_SETFLAG, 30 | ANIMEVENT_TYPE_CLEARFLAG, 31 | ANIMEVENT_TYPE_PAUSE 32 | }; 33 | 34 | /* ACCELERATION MODES */ 35 | enum 36 | { 37 | ACCEL_MODE_LINEAR, 38 | ACCEL_MODE_EASEINOUT, 39 | ACCEL_MODE_EASEIN, 40 | ACCEL_MODE_EASEOUT 41 | }; 42 | 43 | /* SLIDERS */ 44 | 45 | typedef struct 46 | { 47 | Rect bounds; 48 | long type; 49 | long info1; 50 | long info2; 51 | }SliderBox; 52 | 53 | 54 | enum 55 | { 56 | SLIDER_TYPE_CURRENTTIME, 57 | SLIDER_TYPE_KEYFRAME, 58 | SLIDER_TYPE_ANIMEVENT 59 | }; 60 | 61 | #define NUM_ACCELERATION_CURVE_NUBS 23 // THESE MUST MATCH BIO-OREO'S NUMBERS!!! 62 | #define SPLINE_POINTS_PER_NUB 100 63 | #define CURVE_SIZE ((NUM_ACCELERATION_CURVE_NUBS-3)*SPLINE_POINTS_PER_NUB) 64 | 65 | 66 | 67 | 68 | 69 | //============================================================ 70 | 71 | 72 | extern void UpdateSkeletonAnimation(ObjNode *theNode); 73 | extern void SetSkeletonAnim(SkeletonObjDataType *skeleton, long animNum); 74 | extern void GetModelCurrentPosition(SkeletonObjDataType *skeleton); 75 | extern void MorphToSkeletonAnim(SkeletonObjDataType *skeleton, long animNum, float speed); 76 | extern void CalcAccelerationSplineCurve(void); 77 | void SetSkeletonAnimTime(SkeletonObjDataType *skeleton, float timeRatio); 78 | 79 | void BurnSkeleton(ObjNode *theNode, float flameScale); 80 | 81 | 82 | -------------------------------------------------------------------------------- /Source/Headers/skeletonjoints.h: -------------------------------------------------------------------------------- 1 | // 2 | // skeletonJoints.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | enum 9 | { 10 | SKELETON_LIMBTYPE_PILLOW, 11 | SKELETON_LIMBTYPE_LEFTHAND, 12 | SKELETON_LIMBTYPE_HEAD 13 | }; 14 | 15 | 16 | 17 | #define NO_LIMB_MESH (-1) // indicates that this joint's limb mesh does not exist 18 | #define NO_PREVIOUS_JOINT (-1) 19 | 20 | //=========================================== 21 | 22 | extern void UpdateJointTransforms(SkeletonObjDataType *skeleton,long jointNum); 23 | void FindCoordOfJoint(ObjNode *theNode, long jointNum, OGLPoint3D *outPoint); 24 | void FindCoordOnJoint(ObjNode *theNode, long jointNum, const OGLPoint3D *inPoint, OGLPoint3D *outPoint); 25 | void FindJointFullMatrix(ObjNode *theNode, long jointNum, OGLMatrix4x4 *outMatrix); 26 | void FindCoordOnJointAtFlagEvent(ObjNode *theNode, long jointNum, const OGLPoint3D *inPoint, OGLPoint3D *outPoint); 27 | void FindJointMatrixAtFlagEvent(ObjNode *theNode, long jointNum, Byte flagNum, OGLMatrix4x4 *m); 28 | 29 | 30 | -------------------------------------------------------------------------------- /Source/Headers/skeletonobj.h: -------------------------------------------------------------------------------- 1 | // 2 | // SkeletonObj.h 3 | // 4 | 5 | #pragma once 6 | 7 | // Externals 8 | #include "game.h" 9 | 10 | enum 11 | { 12 | SKELETON_TYPE_BILLY = 0, 13 | SKELETON_TYPE_BANDITO, 14 | SKELETON_TYPE_RYGAR, 15 | SKELETON_TYPE_SHORTY, 16 | SKELETON_TYPE_KANGACOW, 17 | SKELETON_TYPE_KANGAREX, 18 | SKELETON_TYPE_WALKER, 19 | SKELETON_TYPE_TREMORALIEN, 20 | SKELETON_TYPE_TREMORGHOST, 21 | SKELETON_TYPE_FROGMAN, 22 | 23 | MAX_SKELETON_TYPES 24 | }; 25 | 26 | 27 | 28 | 29 | //=============================== 30 | 31 | extern ObjNode *MakeNewSkeletonObject(NewObjectDefinitionType *newObjDef); 32 | extern void AllocSkeletonDefinitionMemory(SkeletonDefType *skeleton); 33 | extern void InitSkeletonManager(void); 34 | void LoadASkeleton(Byte num); 35 | extern void FreeSkeletonFile(Byte skeletonType); 36 | extern void FreeAllSkeletonFiles(short skipMe); 37 | extern void FreeSkeletonBaseData(SkeletonObjDataType *data); 38 | void DrawSkeleton(ObjNode *theNode); 39 | -------------------------------------------------------------------------------- /Source/Headers/sobjtypes.h: -------------------------------------------------------------------------------- 1 | // 2 | // sobjtypes.h 3 | // 4 | 5 | #pragma once 6 | 7 | enum 8 | { 9 | SPRITE_GROUP_BIGBOARD, 10 | SPRITE_GROUP_CURSOR, 11 | SPRITE_GROUP_DUEL, 12 | SPRITE_GROUP_FONT, 13 | SPRITE_GROUP_GLOBAL, 14 | SPRITE_GROUP_INFOBAR, 15 | SPRITE_GROUP_PARTICLES, 16 | SPRITE_GROUP_SPHEREMAPS, 17 | SPRITE_GROUP_STAMPEDE, 18 | MAX_SPRITE_GROUPS 19 | }; 20 | 21 | /* GLOBAL SPRITES */ 22 | 23 | enum 24 | { 25 | GLOBAL_SObjType_Shadow_Circular, 26 | 27 | GLOBAL_SObjType_SwampWater, 28 | 29 | GLOBAL_SObjType_Fence_PicketFence, 30 | GLOBAL_SObjType_Fence_Wood, 31 | GLOBAL_SObjType_Fence_White, 32 | GLOBAL_SObjType_Fence_TallGrass, 33 | GLOBAL_SObjType_Fence_SmallGrass, 34 | GLOBAL_SObjType_Fence_SwampTree, 35 | 36 | GLOBAL_SObjType_COUNT, 37 | }; 38 | 39 | 40 | 41 | 42 | 43 | /* SPHEREMAP SPRITES */ 44 | 45 | enum 46 | { 47 | SPHEREMAP_SObjType_Satin, 48 | SPHEREMAP_SObjType_Sheen, 49 | 50 | SPHEREMAP_SObjType_COUNT, 51 | }; 52 | 53 | 54 | 55 | /* PARTICLE SPRITES */ 56 | 57 | enum 58 | { 59 | PARTICLE_SObjType_WhiteSpark, 60 | PARTICLE_SObjType_WhiteSpark2, 61 | PARTICLE_SObjType_WhiteSpark3, 62 | PARTICLE_SObjType_WhiteSpark4, 63 | PARTICLE_SObjType_WhiteGlow, 64 | 65 | PARTICLE_SObjType_RedGlint, 66 | PARTICLE_SObjType_GreenGlint, 67 | PARTICLE_SObjType_BlueGlint, 68 | PARTICLE_SObjType_YellowGlint, 69 | 70 | PARTICLE_SObjType_RedSpark, 71 | PARTICLE_SObjType_GreenSpark, 72 | PARTICLE_SObjType_BlueSpark, 73 | 74 | PARTICLE_SObjType_GreySmoke, 75 | PARTICLE_SObjType_BlackSmoke, 76 | PARTICLE_SObjType_RedFumes, 77 | PARTICLE_SObjType_GreenFumes, 78 | PARTICLE_SObjType_Dust, 79 | 80 | PARTICLE_SObjType_Splash, 81 | PARTICLE_SObjType_SnowFlakes, 82 | PARTICLE_SObjType_Fire, 83 | 84 | PARTICLE_SObjType_BloodSpat, 85 | 86 | PARTICLE_SObjType_LensFlare0, 87 | PARTICLE_SObjType_LensFlare1, 88 | PARTICLE_SObjType_LensFlare2, 89 | PARTICLE_SObjType_LensFlare3, 90 | 91 | PARTICLE_SObjType_Flame0, 92 | PARTICLE_SObjType_Flame1, 93 | PARTICLE_SObjType_Flame2, 94 | PARTICLE_SObjType_Flame3, 95 | PARTICLE_SObjType_Flame4, 96 | PARTICLE_SObjType_Flame5, 97 | PARTICLE_SObjType_Flame6, 98 | PARTICLE_SObjType_Flame7, 99 | PARTICLE_SObjType_Flame8, 100 | PARTICLE_SObjType_Flame9, 101 | PARTICLE_SObjType_Flame10, 102 | 103 | PARTICLE_SObjType_COUNT, 104 | }; 105 | 106 | /******************* FONT SOBJTYPES *************************/ 107 | 108 | enum 109 | { 110 | FONT_SObjType_Comma, 111 | FONT_SObjType_Dash, 112 | FONT_SObjType_Period, 113 | FONT_SObjType_QuestionMark, 114 | FONT_SObjType_ExclamationMark, 115 | FONT_SObjType_ExclamationMark2, 116 | FONT_SObjType_Apostrophe, 117 | 118 | FONT_SObjType_UU, 119 | FONT_SObjType_uu, 120 | FONT_SObjType_ua, 121 | FONT_SObjType_OO, 122 | FONT_SObjType_oo, 123 | FONT_SObjType_AA, 124 | FONT_SObjType_AO, 125 | FONT_SObjType_NN, 126 | FONT_SObjType_nn, 127 | FONT_SObjType_EE, 128 | FONT_SObjType_ee, 129 | FONT_SObjType_ev, 130 | FONT_SObjType_Ax, 131 | FONT_SObjType_ax, 132 | FONT_SObjType_av, 133 | FONT_SObjType_au, 134 | FONT_SObjType_ao, 135 | FONT_SObjType_aa, 136 | FONT_SObjType_Ox, 137 | FONT_SObjType_Oa, 138 | FONT_SObjType_oa, 139 | FONT_SObjType_beta, 140 | FONT_SObjType_ia, 141 | 142 | FONT_SObjType_0, 143 | FONT_SObjType_1, 144 | FONT_SObjType_2, 145 | FONT_SObjType_3, 146 | FONT_SObjType_4, 147 | FONT_SObjType_5, 148 | FONT_SObjType_6, 149 | FONT_SObjType_7, 150 | FONT_SObjType_8, 151 | FONT_SObjType_9, 152 | 153 | FONT_SObjType_a, 154 | FONT_SObjType_b, 155 | FONT_SObjType_c, 156 | FONT_SObjType_d, 157 | FONT_SObjType_e, 158 | FONT_SObjType_f, 159 | FONT_SObjType_g, 160 | FONT_SObjType_h, 161 | FONT_SObjType_i, 162 | FONT_SObjType_j, 163 | FONT_SObjType_k, 164 | FONT_SObjType_l, 165 | FONT_SObjType_m, 166 | FONT_SObjType_n, 167 | FONT_SObjType_o, 168 | FONT_SObjType_p, 169 | FONT_SObjType_q, 170 | FONT_SObjType_r, 171 | FONT_SObjType_s, 172 | FONT_SObjType_t, 173 | FONT_SObjType_u, 174 | FONT_SObjType_v, 175 | FONT_SObjType_w, 176 | FONT_SObjType_x, 177 | FONT_SObjType_y, 178 | FONT_SObjType_z, 179 | 180 | FONT_SObjType_A, 181 | FONT_SObjType_B, 182 | FONT_SObjType_C, 183 | FONT_SObjType_D, 184 | FONT_SObjType_E, 185 | FONT_SObjType_F, 186 | FONT_SObjType_G, 187 | FONT_SObjType_H, 188 | FONT_SObjType_I, 189 | FONT_SObjType_J, 190 | FONT_SObjType_K, 191 | FONT_SObjType_L, 192 | FONT_SObjType_M, 193 | FONT_SObjType_N, 194 | FONT_SObjType_O, 195 | FONT_SObjType_P, 196 | FONT_SObjType_Q, 197 | FONT_SObjType_R, 198 | FONT_SObjType_S, 199 | FONT_SObjType_T, 200 | FONT_SObjType_U, 201 | FONT_SObjType_V, 202 | FONT_SObjType_W, 203 | FONT_SObjType_X, 204 | FONT_SObjType_Y, 205 | FONT_SObjType_Z, 206 | 207 | FONT_SObjType_Cursor, 208 | FONT_SObjType_Percent, 209 | FONT_SObjType_Slash, 210 | 211 | FONT_SObjType_COUNT, 212 | }; 213 | 214 | /******************* INFOBAR SOBJTYPES *************************/ 215 | 216 | enum 217 | { 218 | INFOBAR_SObjType_HealthFrame, 219 | INFOBAR_SObjType_HealthAmmoFrame, 220 | INFOBAR_SObjType_HealthAmmoShieldFrame, 221 | 222 | INFOBAR_SObjType_Bullet, 223 | INFOBAR_SObjType_Heart, 224 | INFOBAR_SObjType_Skull, 225 | INFOBAR_SObjType_StarOn, 226 | 227 | INFOBAR_SObjType_PausedFrame, 228 | INFOBAR_SObjType_PausedDot, 229 | 230 | INFOBAR_SObjType_TimerFrame, 231 | 232 | INFOBAR_SObjType_CommandKey, 233 | INFOBAR_SObjType_AltKey, 234 | 235 | INFOBAR_SObjType_COUNT, 236 | }; 237 | 238 | 239 | 240 | 241 | /******************* DUEL SPRITES *************************/ 242 | 243 | enum 244 | { 245 | DUEL_SObjType_StatBar4x3, 246 | 247 | DUEL_SObjType_UpArrow, 248 | DUEL_SObjType_RightArrow, 249 | DUEL_SObjType_DownArrow, 250 | DUEL_SObjType_LeftArrow, 251 | 252 | DUEL_SObjType_UpArrowOff, 253 | DUEL_SObjType_RightArrowOff, 254 | DUEL_SObjType_DownArrowOff, 255 | DUEL_SObjType_LeftArrowOff, 256 | 257 | DUEL_SObjType_ReflexDot, 258 | DUEL_SObjType_FullLight, 259 | 260 | DUEL_SObjType_StatBarWidescreen, 261 | 262 | DUEL_SObjType_COUNT, 263 | }; 264 | 265 | /******************* CURSOR SPRITES *************************/ 266 | 267 | enum 268 | { 269 | CURSOR_SObjType_Crosshairs, 270 | CURSOR_SObjType_BulletHole, 271 | CURSOR_SObjType_COUNT, 272 | }; 273 | 274 | /******************* STAMPEDE SPRITES *************************/ 275 | 276 | enum 277 | { 278 | STAMPEDE_SObjType_Fence_Canyon, 279 | STAMPEDE_SObjType_COUNT, 280 | }; 281 | 282 | /******************* BIGBOARD SPRITES *************************/ 283 | 284 | 285 | enum 286 | { 287 | BIGBOARD_SObjType_TownShootoutIcon, 288 | BIGBOARD_SObjType_TownShootoutIcon2, 289 | BIGBOARD_SObjType_TownStampedeIcon, 290 | BIGBOARD_SObjType_TownStampedeIcon2, 291 | BIGBOARD_SObjType_TownTargetsIcon, 292 | BIGBOARD_SObjType_TownTargetsIcon2, 293 | 294 | BIGBOARD_SObjType_SwampShootoutIcon, 295 | BIGBOARD_SObjType_SwampShootoutIcon2, 296 | BIGBOARD_SObjType_SwampStampedeIcon, 297 | BIGBOARD_SObjType_SwampStampedeIcon2, 298 | BIGBOARD_SObjType_SwampTargetsIcon, 299 | BIGBOARD_SObjType_SwampTargetsIcon2, 300 | 301 | BIGBOARD_SObjType_SaveGameIcon, 302 | BIGBOARD_SObjType_SaveGameIcon2, 303 | BIGBOARD_SObjType_EndGameIcon, 304 | BIGBOARD_SObjType_EndGameIcon2, 305 | 306 | BIGBOARD_SObjType_COUNT 307 | }; -------------------------------------------------------------------------------- /Source/Headers/sound2.h: -------------------------------------------------------------------------------- 1 | // 2 | // Sound2.h 3 | // 4 | 5 | #pragma once 6 | 7 | typedef struct 8 | { 9 | short effectNum; 10 | float volumeAdjust; 11 | float leftVolume, rightVolume; 12 | Boolean isLooping; 13 | }ChannelInfoType; 14 | 15 | 16 | 17 | #define BASE_EFFECT_RESOURCE 10000 18 | 19 | #define FULL_CHANNEL_VOLUME kFullVolume 20 | #define NORMAL_CHANNEL_RATE 0x10000 21 | 22 | 23 | 24 | enum 25 | { 26 | SONG_THEME = 0, 27 | SONG_DUEL, 28 | SONG_STAMPEDE, 29 | SONG_SHOOTOUT, 30 | SONG_LOSE, 31 | 32 | MAX_SONGS 33 | }; 34 | 35 | 36 | /***************** EFFECTS *************************/ 37 | // This table must match gEffectsTable 38 | // 39 | 40 | enum 41 | { 42 | EFFECT_GUNSHOT1, 43 | EFFECT_GUNSHOT2, 44 | EFFECT_GUNSHOT3, 45 | EFFECT_BULLETHIT, 46 | EFFECT_SPURS1, 47 | EFFECT_SPURS2, 48 | EFFECT_SHIELDHIT, 49 | EFFECT_WIND, 50 | EFFECT_MOO1, 51 | EFFECT_MOO2, 52 | EFFECT_RELOAD, 53 | EFFECT_RICOCHET, 54 | EFFECT_DUELKEY, 55 | EFFECT_DUELFAIL, 56 | EFFECT_DUELKEYSDONE, 57 | EFFECT_HOOF, 58 | EFFECT_WALKERCRASH, 59 | EFFECT_BULLETHITMETAL, 60 | EFFECT_WALKERFOOTSTEP, 61 | EFFECT_WALKERAMBIENT, 62 | EFFECT_CRATEEXPLODE, 63 | EFFECT_GLASSBREAK, 64 | EFFECT_COINSMASH, 65 | EFFECT_GHOSTVAPORIZE, 66 | EFFECT_EMPTY, 67 | EFFECT_TRAMPLED, 68 | EFFECT_GETCOIN, 69 | EFFECT_LAUNCHMISSILE, 70 | EFFECT_EXPLOSION, 71 | EFFECT_DEATHSKULL, 72 | EFFECT_TIMERCHIME, 73 | EFFECT_SWISH, 74 | EFFECT_YELP, 75 | EFFECT_ALARM, 76 | 77 | NUM_EFFECTS 78 | }; 79 | 80 | 81 | //===================== PROTOTYPES =================================== 82 | 83 | 84 | void InitSoundTools(void); 85 | void ShutdownSound(void); 86 | 87 | void StopAChannel(short *channelNum); 88 | extern void StopAllEffectChannels(void); 89 | void PlaySong(short songNum, Boolean loopFlag); 90 | extern void KillSong(void); 91 | extern short PlayEffect(short effectNum); 92 | short PlayEffect_Parms3D(short effectNum, const OGLPoint3D *where, uint32_t rateMultiplier, float volumeAdjust); 93 | extern void ToggleMusic(void); 94 | void LoadSoundBank(void); 95 | void DisposeSoundBank(void); 96 | short PlayEffect_Parms(short effectNum, uint32_t leftVolume, uint32_t rightVolume, unsigned long rateMultiplier); 97 | void PauseAllChannels(Boolean pause); 98 | void ChangeChannelVolume(short channel, float leftVol, float rightVol); 99 | short PlayEffect3D(short effectNum, const OGLPoint3D *where); 100 | Boolean Update3DSoundChannel(short effectNum, short *channel, OGLPoint3D *where); 101 | Boolean IsEffectChannelPlaying(short chanNum); 102 | void UpdateListenerLocation(void); 103 | void ChangeChannelRate(short channel, long rateMult); 104 | 105 | 106 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /Source/Headers/sparkle.h: -------------------------------------------------------------------------------- 1 | // 2 | // sparkle.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | #define MAX_SPARKLES 600 9 | 10 | enum 11 | { 12 | SPARKLE_FLAG_OMNIDIRECTIONAL = 1, // if is visible from any angle 13 | SPARKLE_FLAG_RANDOMSPIN = (1<<1), 14 | SPARKLE_FLAG_TRANSFORMWITHOWNER = (1<<2), // if want to use owner's transform matrix 15 | SPARKLE_FLAG_FLICKER = (1<<3) 16 | }; 17 | 18 | typedef struct 19 | { 20 | Boolean isActive; // true if this one is active 21 | ObjNode *owner; // node which owns this sparkle (or nil) 22 | uint32_t flags; 23 | OGLPoint3D where; 24 | OGLVector3D aim; 25 | OGLColorRGBA color; 26 | float scale; 27 | float separation; // how far to move sparkle from base coord toward camera 28 | short textureNum; 29 | }SparkleType; 30 | 31 | 32 | void InitSparkles(void); 33 | short GetFreeSparkle(ObjNode *theNode); 34 | void DeleteSparkle(short i); 35 | void DrawSparkles(void); 36 | 37 | -------------------------------------------------------------------------------- /Source/Headers/splineitems.h: -------------------------------------------------------------------------------- 1 | // 2 | // splineitems.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | //===================================================== 9 | 10 | void PrimeSplines(void); 11 | void GetCoordOnSplineFromIndex(SplineDefType *splinePtr, double findex, float *x, float *z); 12 | void GetCoordOnSpline(SplineDefType *splinePtr, double placement, float *x, float *z); 13 | void GetCoordOnSpline2(SplineDefType *splinePtr, double placement, double offset, float *x, float *z, Boolean allowWrap); 14 | void GetNextCoordOnSpline(SplineDefType *splinePtr, double placement, float *x, float *z); 15 | Boolean UpdateSplineItemVisibilityOnActiveTerrain(ObjNode *theNode); 16 | void AddToSplineObjectList(ObjNode *theNode, Boolean setAim); 17 | void MoveSplineObjects(void); 18 | Boolean RemoveFromSplineObjectList(ObjNode *theNode); 19 | void EmptySplineObjectList(void); 20 | Boolean IncreaseSplineIndex(ObjNode *theNode, double speed, Boolean noWrapping); 21 | void IncreaseSplineIndexZigZag(ObjNode *theNode, double speed); 22 | void DetachObjectFromSpline(ObjNode* theNode, movecall_t moveCall); 23 | void SetSplineAim(ObjNode *theNode); 24 | void GetObjectCoordOnSpline(ObjNode *theNode); 25 | void GetObjectCoordOnSpline2(ObjNode *theNode, float *x, float *z); 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /Source/Headers/sprites.h: -------------------------------------------------------------------------------- 1 | // 2 | // sprites.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | enum 9 | { 10 | SPRITE_FLAG_GLOW = (1) 11 | }; 12 | 13 | 14 | typedef struct 15 | { 16 | int32_t width; 17 | int32_t height; 18 | float aspectRatio; // h/w 19 | GLint srcFormat; 20 | GLint destFormat; 21 | MetaObjectPtr materialObject; 22 | }SpriteType; 23 | 24 | 25 | void InitSpriteManager(void); 26 | void DisposeAllSpriteGroups(void); 27 | void DisposeSpriteGroup(int groupNum); 28 | void LoadSpriteGroup(int groupNum); 29 | ObjNode *MakeSpriteObject(NewObjectDefinitionType *newObjDef); 30 | void SetSpriteGroupMaterialFlags(short group, uint32_t flags); 31 | void ModifySpriteObjectFrame(ObjNode *theNode, short type); 32 | void DrawSprite(int group, int type, float x, float y, float scale, float rot, uint32_t flags); 33 | void BlendASprite(int group, int type); 34 | 35 | ObjNode *MakeFontStringObject(const char* cstr, NewObjectDefinitionType *newObjDef, Boolean center); 36 | int CharToSprite(char c); 37 | float GetCharSpacing(char c, float spacingScale); 38 | float GetStringWidth(const char* cstr, float scale); 39 | void DrawFontString(const char* cstr, float x, float y, float scale, Boolean center); 40 | -------------------------------------------------------------------------------- /Source/Headers/terrain.h: -------------------------------------------------------------------------------- 1 | // 2 | // Terrain.h 3 | // 4 | 5 | #pragma once 6 | 7 | // Externals 8 | #include "game.h" 9 | #include "main.h" 10 | 11 | 12 | enum 13 | { 14 | MAP_ITEM_MYSTARTCOORD = 0, // map item # for my start coords 15 | MAP_ITEM_SHOOTOUT_FROGMAN = 7, 16 | MAP_ITEM_SHOOTOUT_BANDITO = 8, 17 | MAP_ITEM_SHOOTOUT_SWAMPGRAVE = 28, 18 | MAP_ITEM_SHOOTOUT_TREMORALIEN = 31, 19 | MAP_ITEM_SHOOTOUT_SHORTY = 35 20 | 21 | }; 22 | 23 | #define ILLEGAL_TERRAIN_Y -10000.0f // returned from GetTerrainY if no terrain is loaded 24 | 25 | /* SUPER TILE MODES */ 26 | 27 | enum 28 | { 29 | SUPERTILE_MODE_FREE, 30 | SUPERTILE_MODE_USED 31 | }; 32 | 33 | #define DEFAULT_TERRAIN_SCALE 125.0f // size of a polygon 34 | #define SUPERTILE_TEXMAP_SIZE 256 // the width & height of a supertile's texture 35 | 36 | #define SUPERTILE_SIZE 8 // size of a super-tile / terrain object zone 37 | 38 | #define OREOMAP_TILE_SIZE (SUPERTILE_TEXMAP_SIZE/SUPERTILE_SIZE) // pixel w/h of texture tile 39 | 40 | #define NUM_TRIS_IN_SUPERTILE (SUPERTILE_SIZE * SUPERTILE_SIZE * 2) // 2 triangles per tile 41 | #define NUM_VERTICES_IN_SUPERTILE ((SUPERTILE_SIZE+1)*(SUPERTILE_SIZE+1)) // # vertices in a supertile 42 | 43 | #define MAX_SUPERTILE_ACTIVE_RANGE 9 44 | 45 | #define SUPERTILE_DIST_WIDE (gSuperTileActiveRange*2) 46 | #define SUPERTILE_DIST_DEEP (gSuperTileActiveRange*2) 47 | 48 | // # visible supertiles * 2 players * 2 buffers 49 | // We need the x2 buffer because we dont free unused supertiles 50 | // until after we've allocated new supertiles, so we'll always 51 | // need more supertiles than are actually ever used. 52 | 53 | #define MAX_SUPERTILES ((MAX_SUPERTILE_ACTIVE_RANGE*2 * MAX_SUPERTILE_ACTIVE_RANGE*2)*2) // the final *2 is because the old supertiles are not deleted until 54 | // after new ones are created, thus we need some extas - worst case 55 | // scenario is twice as many. 56 | 57 | #define MAX_TERRAIN_WIDTH 400 58 | #define MAX_TERRAIN_DEPTH 400 59 | 60 | #define MAX_SUPERTILES_WIDE (MAX_TERRAIN_WIDTH/SUPERTILE_SIZE) 61 | #define MAX_SUPERTILES_DEEP (MAX_TERRAIN_DEPTH/SUPERTILE_SIZE) 62 | 63 | 64 | #define MAX_SUPERTILE_TEXTURES (MAX_SUPERTILES_WIDE*MAX_SUPERTILES_DEEP) 65 | 66 | 67 | //===================================================================== 68 | 69 | 70 | struct SuperTileMemoryType 71 | { 72 | Boolean culledLastDraw; // true if this supertile was culled the last time it was drawn 73 | Byte hiccupTimer; // # frames to skip for use 74 | Byte mode; // free, used, etc. 75 | float x,z,y; // world coords 76 | long left,back; // integer coords of back/left corner 77 | int tileRow,tileCol; // tile row/col of the start of this supertile 78 | MOMaterialObject *texture; // refs to materials 79 | MOVertexArrayData *meshData; // mesh's data for the supertile 80 | OGLBoundingBox bBox; // bounding box 81 | }; 82 | typedef struct SuperTileMemoryType SuperTileMemoryType; 83 | 84 | 85 | typedef struct 86 | { 87 | uint16_t numItems; 88 | uint16_t itemIndex; 89 | }SuperTileItemIndexType; 90 | 91 | 92 | #define BOTTOMLESS_PIT_Y -100000.0f // to identify a blank area on Cloud Level 93 | 94 | 95 | /* TERRAIN ITEM FLAGS */ 96 | 97 | enum 98 | { 99 | ITEM_FLAGS_INUSE = (1), 100 | ITEM_FLAGS_USER1 = (1<<1), 101 | ITEM_FLAGS_USER2 = (1<<2), 102 | ITEM_FLAGS_USER3 = (1<<3) 103 | }; 104 | 105 | 106 | enum 107 | { 108 | SPLIT_BACKWARD = 0, 109 | SPLIT_FORWARD, 110 | SPLIT_ARBITRARY 111 | }; 112 | 113 | 114 | typedef struct 115 | { 116 | uint16_t supertileIndex; 117 | Byte statusFlags; 118 | Boolean playerHereFlag; 119 | }SuperTileStatus; 120 | 121 | enum // statusFlags 122 | { 123 | SUPERTILE_IS_DEFINED = 1, 124 | SUPERTILE_IS_USED_THIS_FRAME = (1<<1) 125 | }; 126 | 127 | 128 | typedef struct 129 | { 130 | Boolean isUsed; 131 | Byte type; 132 | float amplitude; // max height of wave 133 | float radius; // radius of deformation wave 134 | float speed; // speed of wave 135 | float oneOverWaveLength; // 1.0 / wavelength 136 | float radialWidth; // width of radial wave 137 | float decayRate; // decay rate of wave 138 | OGLVector2D origin; // origin of wave 139 | }DeformationType; 140 | 141 | 142 | #define MAX_DEFORMATIONS 8 143 | 144 | enum 145 | { 146 | DEFORMATION_TYPE_JELLO, 147 | DEFORMATION_TYPE_RADIALWAVE, 148 | DEFORMATION_TYPE_CONTINUOUSWAVE, 149 | DEFORMATION_TYPE_DAMPEN, 150 | DEFORMATION_TYPE_WELL 151 | }; 152 | 153 | 154 | #define MAX_LINEMARKERS 20 155 | 156 | typedef struct 157 | { 158 | int16_t unused; 159 | int16_t infoBits; 160 | 161 | float x[2],z[2]; // the two endpoints 162 | }LineMarkerDefType; 163 | 164 | 165 | //===================================================================== 166 | 167 | 168 | void SetTerrainScale(float polygonSize); 169 | void DrawTerrain(ObjNode *theNode); 170 | void CreateSuperTileMemoryList(void); 171 | void DisposeSuperTileMemoryList(void); 172 | void DisposeTerrain(void); 173 | void GetSuperTileInfo(int x, int z, int *superCol, int *superRow, int *tileCol, int *tileRow); 174 | void InitTerrainManager(void); 175 | float GetTerrainY(float x, float z); 176 | float GetMinTerrainY(float x, float z, short group, short type, float scale); 177 | void InitCurrentScrollSettings(void); 178 | 179 | extern void BuildTerrainItemList(void); 180 | void AddTerrainItemsOnSuperTile(long row, long col); 181 | extern Boolean TrackTerrainItem(ObjNode *theNode); 182 | Boolean TrackTerrainItem_FromInit(ObjNode *theNode); 183 | Boolean SeeIfCoordsOutOfRange(float x, float z); 184 | extern void FindPlayerStartCoordItems(void); 185 | void InitSuperTileGrid(void); 186 | void RotateOnTerrain(ObjNode *theNode, float yOffset, OGLVector3D *surfaceNormal); 187 | void KeepTerrainAlive(void); 188 | void DoPlayerTerrainUpdate(float x, float y); 189 | void CalcTileNormals(long row, long col, OGLVector3D *n1, OGLVector3D *n2); 190 | void CalcTileNormals_NotNormalized(long row, long col, OGLVector3D *n1, OGLVector3D *n2); 191 | void CalculateSplitModeMatrix(void); 192 | void CalculateSupertileVertexNormals(MOVertexArrayData *meshData, long startRow, long startCol); 193 | 194 | short NewSuperTileDeformation(DeformationType *data); 195 | void DeleteTerrainDeformation(short i); 196 | void UpdateDeformationCoords(short defNum, float x, float z); 197 | 198 | void DoItemShadowCasting(void); 199 | Boolean SeeIfCrossedLineMarker(OGLPoint3D *from, OGLPoint3D *to, int *whichLine); 200 | -------------------------------------------------------------------------------- /Source/Headers/triangulate.h: -------------------------------------------------------------------------------- 1 | // 2 | // triangulate.h 3 | // 4 | 5 | // Externals 6 | #include "game.h" 7 | 8 | void Triangulate(int numPoints, OGLVertex *vertexList, MOTriangleIndecies *tri, int *numTris, int triangeListSize); 9 | -------------------------------------------------------------------------------- /Source/Headers/version.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define GAME_NAME "BillyFrontier" 4 | #define GAME_FULL_NAME "Billy Frontier" 5 | #define GAME_IDENTIFIER "io.jor.billyfrontier" 6 | #define GAME_VERSION "1.1.2" 7 | #define GAME_VERSION_MAJOR 1 8 | #define GAME_VERSION_MINOR 1 9 | #define GAME_VERSION_PATCH 2 10 | -------------------------------------------------------------------------------- /Source/Headers/version.h.in: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define GAME_NAME "@GAME_TARGET@" 4 | #define GAME_FULL_NAME "@GAME_FULL_NAME@" 5 | #define GAME_IDENTIFIER "@GAME_IDENTIFIER@" 6 | #define GAME_VERSION "@PROJECT_VERSION@" 7 | #define GAME_VERSION_MAJOR @PROJECT_VERSION_MAJOR@ 8 | #define GAME_VERSION_MINOR @PROJECT_VERSION_MINOR@ 9 | #define GAME_VERSION_PATCH @PROJECT_VERSION_PATCH@ 10 | -------------------------------------------------------------------------------- /Source/Headers/water.h: -------------------------------------------------------------------------------- 1 | // 2 | // water.h 3 | // 4 | 5 | #pragma once 6 | 7 | // TODO: Is this actually used in Billy Frontier? 8 | 9 | #define MAX_WATER_POINTS 100 // note: cannot change this without breaking data files!! 10 | 11 | // Externals 12 | #include "game.h" 13 | 14 | enum 15 | { 16 | WATER_FLAG_FIXEDHEIGHT = (1) 17 | }; 18 | 19 | enum 20 | { 21 | WATER_TYPE_BLUEWATER, 22 | WATER_TYPE_POOLWATER, 23 | WATER_TYPE_GARBAGE, 24 | 25 | NUM_WATER_TYPES 26 | }; 27 | 28 | 29 | typedef struct // NOTE: MUST MATCH OREOTERRAIN DATA!!! 30 | { 31 | uint16_t type; // type of water 32 | uint32_t flags; // flags 33 | int32_t height; // height offset or hard-wired index 34 | int16_t numNubs; // # nubs in water 35 | int32_t reserved; // for future use 36 | OGLPoint2D nubList[MAX_WATER_POINTS]; // nub list 37 | 38 | float hotSpotX,hotSpotZ; // hot spot coords 39 | Rect bBox; // bounding box of water area 40 | }WaterDefType; 41 | 42 | 43 | 44 | 45 | //============================================ 46 | 47 | void PrimeTerrainWater(void); 48 | void DisposeWater(void); 49 | Boolean DoWaterCollisionDetect(ObjNode *theNode, float x, float y, float z, int *patchNum); 50 | Boolean IsXZOverWater(float x, float z); 51 | Boolean GetWaterY(float x, float z, float *y); 52 | 53 | -------------------------------------------------------------------------------- /Source/Headers/window.h: -------------------------------------------------------------------------------- 1 | // 2 | // windows.h 3 | // 4 | 5 | #define ALLOW_FADE 1 6 | 7 | extern void InitWindowStuff(void); 8 | ObjNode* MakeFadeEvent(Boolean fadeIn); 9 | 10 | void OGL_FadeOutScene(void (*drawCall)(void), void (*moveCall)(void)); 11 | 12 | void Wait(long ticks); 13 | 14 | void Enter2D(Boolean pauseDSp); 15 | void Exit2D(void); 16 | 17 | void GetDefaultWindowSize(int display, int* width, int* height); 18 | int GetNumDisplays(void); 19 | void MoveToPreferredDisplay(void); 20 | void SetFullscreenMode(bool enforceDisplayPref); 21 | -------------------------------------------------------------------------------- /Source/Screens/MiscScreens.c: -------------------------------------------------------------------------------- 1 | /****************************/ 2 | /* MISCSCREENS.C */ 3 | /* (c)2002 Pangea Software */ 4 | /* By Brian Greenstone */ 5 | /****************************/ 6 | 7 | 8 | /****************************/ 9 | /* EXTERNALS */ 10 | /****************************/ 11 | 12 | #include "game.h" 13 | 14 | /****************************/ 15 | /* PROTOTYPES */ 16 | /****************************/ 17 | 18 | static void MoveDarkenPane(ObjNode *theNode); 19 | static void DrawDarkenPane(ObjNode *theNode); 20 | 21 | 22 | /****************************/ 23 | /* CONSTANTS */ 24 | /****************************/ 25 | 26 | 27 | 28 | /*********************/ 29 | /* VARIABLES */ 30 | /*********************/ 31 | 32 | 33 | 34 | /******* DO PROGRAM WARM-UP SCREEN AS WE PRELOAD ASSETS **********/ 35 | 36 | void DoWarmUpScreen(void) 37 | { 38 | OGLSetupInputType viewDef; 39 | 40 | /* SETUP VIEW */ 41 | 42 | OGL_NewViewDef(&viewDef); 43 | // viewDef.view.pillarboxRatio = PILLARBOX_RATIO_FULLSCREEN; 44 | // viewDef.view.fontName = "rockfont"; 45 | 46 | OGL_SetupWindow(&viewDef); 47 | 48 | /* SHOW IT */ 49 | 50 | for (int i = 0; i < 8; i++) 51 | { 52 | OGL_DrawScene(DrawObjects); 53 | DoSDLMaintenance(); 54 | } 55 | 56 | /* CLEANUP */ 57 | 58 | DeleteAllObjects(); 59 | 60 | OGL_DisposeWindowSetup(); 61 | } 62 | 63 | 64 | /********************** DISPLAY PICTURE **************************/ 65 | // 66 | // Displays a picture using OpenGL until the user clicks the mouse or presses any key. 67 | // If showAndBail == true, then show it and bail out 68 | // 69 | 70 | void DisplayPicture(const char* path) 71 | { 72 | OGLSetupInputType viewDef; 73 | float timeout = 40.0f; 74 | 75 | 76 | 77 | /* SETUP VIEW */ 78 | 79 | OGL_NewViewDef(&viewDef); 80 | 81 | viewDef.camera.hither = 10; 82 | viewDef.camera.yon = 3000; 83 | viewDef.view.clearColor.r = 0; 84 | viewDef.view.clearColor.g = 0; 85 | viewDef.view.clearColor.b = 0; 86 | viewDef.styles.useFog = false; 87 | 88 | OGL_SetupWindow(&viewDef); 89 | 90 | 91 | 92 | /* CREATE BACKGROUND OBJECT */ 93 | 94 | ObjNode* picObj = MakeBackgroundPictureObject(path); 95 | GAME_ASSERT(picObj); 96 | 97 | 98 | 99 | /***********/ 100 | /* SHOW IT */ 101 | /***********/ 102 | 103 | 104 | ReadKeyboard(); 105 | CalcFramesPerSecond(); 106 | CalcFramesPerSecond(); 107 | 108 | MakeFadeEvent(true); 109 | 110 | /* MAIN LOOP */ 111 | 112 | while (1) 113 | { 114 | CalcFramesPerSecond(); 115 | MoveObjects(); 116 | OGL_DrawScene(DrawObjects); 117 | 118 | ReadKeyboard(); 119 | if (UserWantsOut() || GetNewClickState(1)) 120 | break; 121 | 122 | timeout -= gFramesPerSecondFrac; 123 | if (timeout < 0.0f) 124 | break; 125 | } 126 | 127 | /* FADE OUT */ 128 | 129 | OGL_FadeOutScene(DrawObjects, MoveObjects); 130 | 131 | 132 | /* CLEANUP */ 133 | 134 | DeleteAllObjects(); 135 | 136 | OGL_DisposeWindowSetup(); 137 | } 138 | 139 | 140 | #pragma mark - 141 | 142 | /************** DO LEGAL SCREEN *********************/ 143 | 144 | void DoLegalScreen(void) 145 | { 146 | DisplayPicture(":Images:Logo.png"); 147 | } 148 | 149 | 150 | 151 | #pragma mark - 152 | 153 | 154 | /******************** MAKE DARKEN PANE **************************/ 155 | 156 | ObjNode *MakeDarkenPane(void) 157 | { 158 | ObjNode *pane; 159 | 160 | gNewObjectDefinition.genre = CUSTOM_GENRE; 161 | gNewObjectDefinition.flags = STATUS_BIT_NOZWRITES|STATUS_BIT_NOLIGHTING|STATUS_BIT_NOFOG|STATUS_BIT_DOUBLESIDED; 162 | gNewObjectDefinition.slot = SPRITE_SLOT-1; 163 | gNewObjectDefinition.moveCall = MoveDarkenPane; 164 | pane = MakeNewObject(&gNewObjectDefinition); 165 | 166 | pane->Mode = 0; // make lighten 167 | 168 | pane->CustomDrawFunction = DrawDarkenPane; 169 | 170 | pane->ColorFilter.r = 0; 171 | pane->ColorFilter.g = 0; 172 | pane->ColorFilter.b = 0; 173 | pane->ColorFilter.a = 0; 174 | 175 | return(pane); 176 | } 177 | 178 | 179 | /********************* MOVE DARKEN PANE ******************************/ 180 | 181 | static void MoveDarkenPane(ObjNode *theNode) 182 | { 183 | if (theNode->Mode == 0) 184 | { 185 | theNode->ColorFilter.a += gFramesPerSecondFrac * 1.0f; 186 | if (theNode->ColorFilter.a > .6f) 187 | theNode->ColorFilter.a = .6f; 188 | } 189 | else 190 | { 191 | theNode->ColorFilter.a -= gFramesPerSecondFrac * 1.0f; 192 | if (theNode->ColorFilter.a < 0.0f) 193 | { 194 | DeleteObject(theNode); 195 | return; 196 | } 197 | } 198 | } 199 | 200 | 201 | 202 | /********************** DRAW DARKEN PANE *****************************/ 203 | 204 | static void DrawDarkenPane(ObjNode *theNode) 205 | { 206 | glDisable(GL_TEXTURE_2D); 207 | SetColor4fv(theNode->ColorFilter); 208 | glEnable(GL_BLEND); 209 | 210 | glBegin(GL_QUADS); 211 | glVertex3f(-1000,-1000,DARKEN_PANE_Z); 212 | glVertex3f(1000,-1000,DARKEN_PANE_Z); 213 | glVertex3f(1000,1000,DARKEN_PANE_Z); 214 | glVertex3f(-1000,1000,DARKEN_PANE_Z); 215 | glEnd(); 216 | 217 | glDisable(GL_BLEND); 218 | } 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | -------------------------------------------------------------------------------- /Source/System/ISpPresets.r: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | // ISpPresets.r 4 | // 5 | // 6 | 7 | #include "InputSprocket.r" 8 | 9 | /* the InputSprocket application resource tells utility programs how the */ 10 | /* application uses InputSprocket */ 11 | 12 | resource 'isap' (128) 13 | { 14 | callsISpInit, 15 | usesInputSprocket 16 | }; 17 | 18 | 19 | /* the set list resource contains the list of all the saved sets for devices */ 20 | /* that are provided in the application's resource fork */ 21 | 22 | 23 | resource 'setl' (1000) 24 | { 25 | currentVersion, 26 | { 27 | "Default (Keyboard)", 0, kISpDeviceClass_Keyboard, 28 | kISpKeyboardID_Apple, notApplSet, isDefaultSet, 29 | 128, 30 | }; 31 | }; 32 | 33 | 34 | /* Default keyboard set */ 35 | 36 | resource 'tset' (128, "Default (Keyboard)") 37 | { 38 | supportedVersion, 39 | { 40 | /* ANALOG MOVEMENT */ 41 | 42 | leftKey, // Left 43 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 44 | rightKey, // Right 45 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 46 | downKey, // Reverse 47 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 48 | upKey, // Forward 49 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 50 | 51 | 52 | /* COMMANDS */ 53 | 54 | spaceKey, // Jump 55 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 56 | commandKey, // Kick 57 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 58 | shiftKey, // AutoWalk 59 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 60 | optionKey, // Pickup 61 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 62 | 63 | tabKey, // buddy bug 64 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 65 | 66 | 67 | /* MISC */ 68 | 69 | lessThanKey, // Cam Right 70 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 71 | 72 | greaterThanKey, // Cam Left 73 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 74 | 75 | returnKey, // Cam Mode 76 | rControlOff, rOptionOff, rShiftOff, controlOff, optionOff, shiftOff, commandOff, 77 | 78 | }; 79 | }; 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /Source/System/LZSS.c: -------------------------------------------------------------------------------- 1 | /****************************/ 2 | /* LZSS.C */ 3 | /* (c)2000 Pangea Software */ 4 | /* By Brian Greenstone */ 5 | /****************************/ 6 | 7 | #include "lzss.h" 8 | #include "game.h" 9 | 10 | #define RING_BUFF_SIZE 4096 // size of ring buffer 11 | #define F 18 // upper limit for match_length 12 | #define THRESHOLD 2 // encode string into position and length if match_length is greater than this 13 | 14 | size_t LZSS_Decode(short fRefNum, Ptr destPtr, long sourceSize) 15 | { 16 | int i, j, k, r; 17 | unsigned short flags; 18 | Ptr srcOriginalPtr; 19 | unsigned char *sourcePtr,c; 20 | Ptr initialDestPtr = destPtr; 21 | 22 | 23 | /* GET MEMORY FOR LZSS DATA */ 24 | 25 | // ring buffer of size N, with extra F-1 bytes to facilitate string comparison 26 | unsigned char* text_buf = (unsigned char*) AllocPtr(RING_BUFF_SIZE + F - 1); 27 | 28 | srcOriginalPtr = (Ptr)AllocPtr(sourceSize+1); 29 | GAME_ASSERT(srcOriginalPtr); 30 | 31 | sourcePtr = (unsigned char *)srcOriginalPtr; 32 | 33 | /* READ LZSS DATA */ 34 | 35 | FSRead(fRefNum,&sourceSize,srcOriginalPtr); 36 | 37 | 38 | 39 | /* DECOMPRESS IT */ 40 | 41 | for (i = 0; i < (RING_BUFF_SIZE - F); i++) // clear buff to "default char"? (BLG) 42 | text_buf[i] = ' '; 43 | 44 | r = RING_BUFF_SIZE - F; 45 | flags = 0; 46 | for ( ; ; ) 47 | { 48 | if (((flags >>= 1) & 256) == 0) 49 | { 50 | if (--sourceSize < 0) // see if @ end of source data 51 | break; 52 | c = *sourcePtr++; // get a source byte 53 | flags = (unsigned short)c | 0xff00; // uses higher byte cleverly 54 | } 55 | // to count eight 56 | if (flags & 1) 57 | { 58 | if (--sourceSize < 0) // see if @ end of source data 59 | break; 60 | c = *sourcePtr++; // get a source byte 61 | *destPtr++ = c; 62 | text_buf[r++] = c; 63 | r &= (RING_BUFF_SIZE - 1); 64 | } 65 | else 66 | { 67 | if (--sourceSize < 0) // see if @ end of source data 68 | break; 69 | i = *sourcePtr++; // get a source byte 70 | if (--sourceSize < 0) // see if @ end of source data 71 | break; 72 | j = *sourcePtr++; // get a source byte 73 | 74 | i |= ((j & 0xf0) << 4); 75 | j = (j & 0x0f) + THRESHOLD; 76 | for (k = 0; k <= j; k++) 77 | { 78 | c = text_buf[(i + k) & (RING_BUFF_SIZE - 1)]; 79 | *destPtr++ = c; 80 | text_buf[r++] = c; 81 | r &= (RING_BUFF_SIZE - 1); 82 | } 83 | } 84 | } 85 | 86 | size_t decompSize = destPtr - initialDestPtr; // calc size of decompressed data 87 | 88 | 89 | /* CLEANUP */ 90 | 91 | SafeDisposePtr((Ptr)text_buf); 92 | SafeDisposePtr(srcOriginalPtr); // release the memory for packed buffer 93 | 94 | return(decompSize); 95 | } 96 | -------------------------------------------------------------------------------- /Source/System/stb_image.c: -------------------------------------------------------------------------------- 1 | #include "game.h" 2 | 3 | #define STB_IMAGE_IMPLEMENTATION 4 | #define STBI_NO_STDIO 5 | #define STBI_ONLY_JPEG 6 | #define STBI_ONLY_PNG 7 | #define STBI_ASSERT GAME_ASSERT 8 | #define STBI_MALLOC AllocPtr 9 | #define STBI_REALLOC ReallocPtr 10 | #define STBI_FREE SafeDisposePtr 11 | 12 | #include "stb_image.h" 13 | -------------------------------------------------------------------------------- /extern/README.md: -------------------------------------------------------------------------------- 1 | External libraries go here (Pomme, SDL) -------------------------------------------------------------------------------- /packaging/AppRun: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | SELF=$(readlink -f "$0") 3 | HERE=${SELF%/*} 4 | export PATH="${HERE}/usr/bin/:${HERE}/usr/sbin/:${HERE}/usr/games/:${HERE}/bin/:${HERE}/sbin/${PATH:+:$PATH}" 5 | export LD_LIBRARY_PATH="${HERE}/usr/lib/:${HERE}/usr/lib/i386-linux-gnu/:${HERE}/usr/lib/x86_64-linux-gnu/:${HERE}/usr/lib32/:${HERE}/usr/lib64/:${HERE}/lib/:${HERE}/lib/i386-linux-gnu/:${HERE}/lib/x86_64-linux-gnu/:${HERE}/lib32/:${HERE}/lib64/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" 6 | export PYTHONPATH="${HERE}/usr/share/pyshared/${PYTHONPATH:+:$PYTHONPATH}" 7 | export XDG_DATA_DIRS="${HERE}/usr/share/${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" 8 | export PERLLIB="${HERE}/usr/share/perl5/:${HERE}/usr/lib/perl5/${PERLLIB:+:$PERLLIB}" 9 | export GSETTINGS_SCHEMA_DIR="${HERE}/usr/share/glib-2.0/schemas/${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}" 10 | export QT_PLUGIN_PATH="${HERE}/usr/lib/qt4/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt4/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt4/plugins/:${HERE}/usr/lib32/qt4/plugins/:${HERE}/usr/lib64/qt4/plugins/:${HERE}/usr/lib/qt5/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt5/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt5/plugins/:${HERE}/usr/lib32/qt5/plugins/:${HERE}/usr/lib64/qt5/plugins/${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}" 11 | EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2 | cut -d " " -f 1) 12 | cd $HERE 13 | exec "${EXEC}" "$@" 14 | -------------------------------------------------------------------------------- /packaging/BillyFrontier.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/packaging/BillyFrontier.icns -------------------------------------------------------------------------------- /packaging/BillyFrontier.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/packaging/BillyFrontier.ico -------------------------------------------------------------------------------- /packaging/ReadMe.txt.in: -------------------------------------------------------------------------------- 1 | @GAME_FULL_NAME@ - version @GAME_VERSION@ 2 | @GAME_COPYRIGHT@ 3 | 4 | Visit https://pangeasoft.net for the original makers of the game, 5 | or https://github.com/jorio/@GAME_NAME@ for information about this updated version. 6 | 7 | This port is provided free of charge! If you'd like to support the development of 8 | Pangea game ports, feel free to visit https://jorio.itch.io and name your own price 9 | for any of the games there. Much appreciated! :) 10 | -------------------------------------------------------------------------------- /packaging/io.jor.billyfrontier.appdata.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | io.jor.billyfrontier 4 | CC0-1.0 5 | CC-BY-NC-SA-4.0 6 | Billy Frontier 7 | Cowboys in space 8 | Pangea Software, Inc., Iliyas Jorio 9 | 10 | 11 |

Billy Frontier is an arcade style action game with a “cowboys in space” theme. You get to fight in duels, shootouts and stampedes. It’s the kind of game you’ll want to pick up and play whenever you get that twitch to just shoot something and blow stuff up!

12 | 13 |

About this port: Billy Frontier was released by Pangea Software for PowerPC Macs in 2003. This is a port of the game to modern operating systems, made under permission from Pangea Software, Inc.

14 |
15 | 16 | 17 | Game 18 | ActionGame 19 | 20 | 21 | 22 | mild 23 | mild 24 | 25 | 26 | 27 | keyboard 28 | pointing 29 | 30 | 31 | io.jor.billyfrontier.desktop 32 | 33 | io.jor.billyfrontier.desktop 34 | 35 | 36 | 37 | 38 | https://img.itch.zone/aW1hZ2UvMTY4MTQxNS85OTAyMTM0LnBuZw==/original/WgNG1p.png 39 | 40 | 41 | https://img.itch.zone/aW1hZ2UvMTY4MTQxNS85OTAxNTg5LmpwZw==/original/lhi7NR.jpg 42 | 43 | 44 | https://img.itch.zone/aW1hZ2UvMTY4MTQxNS85OTAxNTkxLmpwZw==/original/8YDvEk.jpg 45 | 46 | 47 | https://img.itch.zone/aW1hZ2UvMTY4MTQxNS85OTAxNjEwLmpwZw==/original/RoFLWB.jpg 48 | 49 | 50 | https://img.itch.zone/aW1hZ2UvMTY4MTQxNS85OTAxNjE1LmpwZw==/original/oVEM6I.jpg 51 | 52 | 53 | 54 | https://jorio.itch.io/billyfrontier 55 | https://ko-fi.com/jorio 56 | https://github.com/jorio/BillyFrontier 57 | https://github.com/jorio/BillyFrontier/issues 58 | 59 | 60 | 61 | https://github.com/jorio/BillyFrontier/releases/tag/v1.1.1 62 | 63 |

New in this release: Improved rotation controls in shootout mode. Turning by ramming the mouse cursor to the edges of the screen feels much smoother now. You can also use the mouse wheel or horizontal trackpad scrolling to turn.

64 |
65 |
66 | 67 | https://github.com/jorio/BillyFrontier/releases/tag/v1.1.0 68 | 69 |

Initial playable release. Widescreen support.

70 |
71 |
72 |
73 |
74 | -------------------------------------------------------------------------------- /packaging/io.jor.billyfrontier.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Version=1.0 4 | Name=Billy Frontier 5 | Comment=Cowboys in space 6 | Icon=io.jor.billyfrontier 7 | Exec=BillyFrontier 8 | Terminal=false 9 | Categories=Game; 10 | -------------------------------------------------------------------------------- /packaging/io.jor.billyfrontier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/packaging/io.jor.billyfrontier.png -------------------------------------------------------------------------------- /packaging/win32.rc.in: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | // UTF-8 4 | #pragma code_page(65001) 5 | 6 | // Icon with lowest ID value placed first to ensure application icon 7 | // remains consistent on all systems. 8 | // 9 | // IMPORTANT: The .ico should be UNCOMPRESSED, as a png-compressed .ico 10 | // may cause garbage AVs to flag the game as a false positive! 11 | IDI_ICON1 ICON DISCARDABLE "@GAME_TARGET@.ico" 12 | 13 | VS_VERSION_INFO VERSIONINFO 14 | FILEVERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,0 15 | PRODUCTVERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,0 16 | FILEOS VOS_NT_WINDOWS32 17 | FILETYPE VFT_APP 18 | BEGIN 19 | BLOCK "StringFileInfo" 20 | BEGIN 21 | BLOCK "040904b0" // US English cp1252 (hex) 22 | BEGIN 23 | VALUE "CompanyName", "Pangea Software, Inc." 24 | VALUE "ProductName", "@GAME_FULL_NAME@" 25 | VALUE "FileDescription", "@GAME_FULL_NAME@" 26 | VALUE "ProductVersion", "@GAME_VERSION@" 27 | VALUE "FileVersion", "@GAME_VERSION@" 28 | VALUE "InternalName", "@GAME_TARGET@" 29 | VALUE "OriginalFilename", "@GAME_TARGET@.exe" 30 | VALUE "LegalCopyright", "@GAME_COPYRIGHT@" 31 | END 32 | END 33 | BLOCK "VarFileInfo" 34 | BEGIN 35 | VALUE "Translation", 0x409, 1252 // US English cp1252 36 | END 37 | END 38 | -------------------------------------------------------------------------------- /screenshot.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jorio/BillyFrontier/04c92dc9b8867e63d728a58df4300a6b47a363a9/screenshot.webp --------------------------------------------------------------------------------