31 Commits

Author SHA1 Message Date
doylet 03920e311c fp: Update website directory to 'Terry_Cherry' 2024-01-21 00:37:07 +11:00
doylet ee95cefdff fp: Update build script for new tely 2023-12-01 16:46:58 +11:00
doylet 4d1fffcc02 build: Fix sokol_audio outputting .obj file 2023-11-27 00:13:04 +11:00
doylet 8663f1b73c fp: Don't use pthreads for emscripten, needs webserver config 2023-11-27 00:08:49 +11:00
doylet 00986fa6a1 fp: Async load audio 2023-11-26 23:45:50 +11:00
doylet 13d356cbfd fp: Fix UB in copies of posix synchronisation primitives 2023-11-26 21:59:36 +11:00
doylet 5ac952eb83 fp: Fix more threading bugs on Windows 2023-11-26 18:51:36 +11:00
doylet 04b4f61810 build: Get changes for linux 2023-11-26 18:43:04 +11:00
doylet 5868fc96df fp: Add posix implementation of pthreads 2023-11-26 18:32:59 +11:00
doylet bca013bf05 fp: Support building via GCC on Windows 2023-11-26 16:54:21 +11:00
doylet 801b9051c9 fp: Address warnings on GCC 2023-11-26 16:28:35 +11:00
doylet f176d66058 build: Fix emscripten build using MSVC style flags 2023-11-26 16:03:53 +11:00
doylet 20d7b7763b build: Fix compile errors on Windows from Linux changes 2023-11-26 14:03:46 +11:00
doylet 05788cc726 build: Get basic linux build working 2023-11-26 00:52:50 +11:00
doylet 88d996af87 build: Add flags for linux build 2023-11-25 18:28:55 +11:00
doylet f8890f0be2 fp: Start working on linux support 2023-11-24 00:22:07 +11:00
doylet 50d6271413 fp: Use audio handles 2023-11-21 22:47:54 +11:00
doylet 93e5302c60 fp: Add initial impl of fade in and out wave music 2023-11-21 00:14:50 +11:00
doylet b03c6c3e56 fp: Get new audio stop functionality 2023-11-15 09:47:34 +11:00
Jojangles 074ba436cb Honestly i'm floundering right now 2023-11-14 09:05:25 +11:00
Jojangles 2d685fcdb9 Submodule changes 2023-11-14 08:59:28 +11:00
Jojangles ebc969603d tely: Add a way to stop music from playing 2023-11-14 08:44:10 +11:00
Jojangles d0b3ce1bd0 fp: Add potential ambience and background music options 2023-11-09 08:37:08 +11:00
Jojangles 97a83b20f6 fp: Add entrance sounds for perry and game start 2023-11-06 08:29:55 +11:00
Jojangles 9ad3754829 fp: Do some wave balancing 2023-11-02 08:30:37 +11:00
doylet 0522e842c4 fp: Switch to sokol audio to fix audio bugs 2023-10-31 00:02:34 +11:00
doylet 9ba6071f9b fp: Only count enemies that are a mob 2023-10-29 23:55:36 +11:00
doylet 131323fbea fp: Update website deploy script source path 2023-10-29 23:49:52 +11:00
doylet e77c85b004 fp: Update readme for new build details 2023-10-29 23:47:50 +11:00
doylet 11d5f34522 fp: Improve tutorial, add a wave break every 3 waves 2023-10-29 23:45:45 +11:00
doylet 285cc9b5ad fp: Add quick tutorial at beginning of game 2023-10-29 17:30:08 +11:00
22 changed files with 1120 additions and 825 deletions
+1
View File
@@ -1,5 +1,6 @@
Build/ Build/
Nocheckin/ Nocheckin/
feely_pona_build.exe feely_pona_build.exe
feely_pona_build
feely_pona_version.txt feely_pona_version.txt
Tools/emsdk Tools/emsdk
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
+1 -1
+1 -21
View File
@@ -1,25 +1,5 @@
@echo off @echo off
setlocal setlocal
set script_dir_backslash=%~dp0 call build_all.bat %* || exit /b 1
set script_dir=%script_dir_backslash:~0,-1%
set build_dir=%script_dir%\Build
set code_dir=%script_dir%
REM Bootstrap a version
git show -s --date=format:%%Y-%%m-%%d --format=%%cd HEAD> feely_pona_version.txt
git rev-parse --short=8 HEAD>> feely_pona_version.txt
git rev-list --count HEAD>> feely_pona_version.txt
REM Bootstrap the build program
mkdir %build_dir% 2>nul
pushd %build_dir%
cl /nologo /Z7 /W4 %code_dir%\feely_pona_build.cpp || exit /B 1
copy feely_pona_build.exe %code_dir% 1>nul
popd
REM Run the build program
%code_dir%\feely_pona_build.exe %* || exit /B 1
popd
exit /B 1
Executable
+21
View File
@@ -0,0 +1,21 @@
#!/bin/bash
set -e
script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
build_dir=${script_dir}/Build
code_dir=${script_dir}
# Bootstrap a version
git show -s --date=format:%Y-%m-%d --format=%cd HEAD> feely_pona_version.txt
git rev-parse --short=8 HEAD>> feely_pona_version.txt
git rev-list --count HEAD>> feely_pona_version.txt
# Bootstrap the build program
mkdir --parents ${build_dir}
pushd ${build_dir}
g++ -g -Wall -o feely_pona_build ${code_dir}/feely_pona_build.cpp -lm -lpthread
cp --force feely_pona_build ${code_dir}
popd
# Run the build program
${code_dir}/feely_pona_build $@
+25
View File
@@ -0,0 +1,25 @@
@echo off
setlocal
set script_dir_backslash=%~dp0
set script_dir=%script_dir_backslash:~0,-1%
set build_dir=%script_dir%\Build
set code_dir=%script_dir%
REM Bootstrap a version
git show -s --date=format:%%Y-%%m-%%d --format=%%cd HEAD> feely_pona_version.txt
git rev-parse --short=8 HEAD>> feely_pona_version.txt
git rev-list --count HEAD>> feely_pona_version.txt
REM Bootstrap the build program
mkdir %build_dir% 2>nul
pushd %build_dir%
cl /nologo /Z7 /W4 %code_dir%\feely_pona_build.cpp || exit /B 1
copy feely_pona_build.exe %code_dir% 1>nul
popd
REM Run the build program
%code_dir%\feely_pona_build.exe %* || exit /B 1
popd
exit /B 1
+4 -4
View File
@@ -5,7 +5,7 @@ set script_dir_backslash=%~dp0
set script_dir=%script_dir_backslash:~0,-1% set script_dir=%script_dir_backslash:~0,-1%
set build_dir=%script_dir%\Build set build_dir=%script_dir%\Build
scp -P 8110 %build_dir%\Terry_Cherry_Emscripten\Terry_Cherry.html doylet@doylet.dev:/selfhost/TerryCherry/index.html scp -P 8110 %build_dir%\Terry_Cherry\Terry_Cherry.html doylet@doylet.dev:/selfhost/Terry_Cherry/index.html
scp -P 8110 %build_dir%\Terry_Cherry_Emscripten\Terry_Cherry.data doylet@doylet.dev:/selfhost/TerryCherry/Terry_Cherry.data scp -P 8110 %build_dir%\Terry_Cherry\Terry_Cherry.data doylet@doylet.dev:/selfhost/Terry_Cherry/Terry_Cherry.data
scp -P 8110 %build_dir%\Terry_Cherry_Emscripten\Terry_Cherry.js doylet@doylet.dev:/selfhost/TerryCherry/Terry_Cherry.js scp -P 8110 %build_dir%\Terry_Cherry\Terry_Cherry.js doylet@doylet.dev:/selfhost/Terry_Cherry/Terry_Cherry.js
scp -P 8110 %build_dir%\Terry_Cherry_Emscripten\Terry_Cherry.wasm doylet@doylet.dev:/selfhost/TerryCherry/Terry_Cherry.wasm scp -P 8110 %build_dir%\Terry_Cherry\Terry_Cherry.wasm doylet@doylet.dev:/selfhost/Terry_Cherry/Terry_Cherry.wasm
+416 -192
View File
File diff suppressed because it is too large Load Diff
+6
View File
@@ -165,6 +165,12 @@ struct FP_ParticleDescriptor
Dqn_usize duration_ms; Dqn_usize duration_ms;
}; };
struct FP_ListenForNewPlayerResult
{
bool yes;
bool tutorial_requested;
};
#if defined(DQN_PLATFORM_EMSCRIPTEN) #if defined(DQN_PLATFORM_EMSCRIPTEN)
#define FP_DEVELOPER_MODE 0 #define FP_DEVELOPER_MODE 0
#else #else
+458 -462
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -185,6 +185,7 @@ static FP_GameEntityHandle FP_Entity_CreateTerryInternal(FP_Game *game, Dqn_V2 p
entity->local_hit_box_size = FP_Game_MetersToPixelsNx2(game->play, 0.5f, entity->sprite_height.meters * .6f); entity->local_hit_box_size = FP_Game_MetersToPixelsNx2(game->play, 0.5f, entity->sprite_height.meters * .6f);
entity->hp_cap = FP_DEFAULT_DAMAGE * 3; entity->hp_cap = FP_DEFAULT_DAMAGE * 3;
entity->hp = entity->hp_cap; entity->hp = entity->hp_cap;
entity->coins = 10;
FP_Entity_AddDebugEditorFlags(game, result); FP_Entity_AddDebugEditorFlags(game, result);
entity->flags |= FP_GameEntityFlag_NonTraversable; entity->flags |= FP_GameEntityFlag_NonTraversable;
entity->flags |= FP_GameEntityFlag_Attackable; entity->flags |= FP_GameEntityFlag_Attackable;
+7 -31
View File
@@ -3,24 +3,24 @@
#include "feely_pona_unity.h" #include "feely_pona_unity.h"
#endif #endif
static bool FP_Game_KeyBindIsPressed(TELY_OSInput const *input, FP_GameControls const *controls, FP_GameKeyBind key_bind) static bool FP_Game_KeyBindIsPressed(TELY_Input const *input, FP_GameControls const *controls, FP_GameKeyBind key_bind)
{ {
bool result = false; bool result = false;
if (controls->mode == FP_GameControlMode_Keyboard) { if (controls->mode == FP_GameControlMode_Keyboard) {
result = TELY_OSInput_ScanKeyIsPressed(input, key_bind.scan_key); result = TELY_Input_ScanKeyIsPressed(input, key_bind.scan_key);
} else { } else {
result = TELY_OSInput_GamepadKeyIsPressed(input, controls->gamepad_index, key_bind.gamepad_key); result = TELY_Input_GamepadKeyIsPressed(input, controls->gamepad_index, key_bind.gamepad_key);
} }
return result; return result;
} }
static bool FP_Game_KeyBindIsDown(TELY_OSInput const *input, FP_GameControls const *controls, FP_GameKeyBind key_bind) static bool FP_Game_KeyBindIsDown(TELY_Input const *input, FP_GameControls const *controls, FP_GameKeyBind key_bind)
{ {
bool result = false; bool result = false;
if (controls->mode == FP_GameControlMode_Keyboard) { if (controls->mode == FP_GameControlMode_Keyboard) {
result = TELY_OSInput_ScanKeyIsDown(input, key_bind.scan_key); result = TELY_Input_ScanKeyIsDown(input, key_bind.scan_key);
} else { } else {
result = TELY_OSInput_GamepadKeyIsDown(input, controls->gamepad_index, key_bind.gamepad_key); result = TELY_Input_GamepadKeyIsDown(input, controls->gamepad_index, key_bind.gamepad_key);
} }
return result; return result;
} }
@@ -250,6 +250,7 @@ static FP_GameEntity *FP_Game_MakeEntityPointerFV(FP_Game *game, DQN_FMT_ATTRIB
result->buildings_visited = FP_SentinelList_Init<FP_GameEntityHandle>(game->play.chunk_pool); result->buildings_visited = FP_SentinelList_Init<FP_GameEntityHandle>(game->play.chunk_pool);
result->action.sprite_alpha = 1.f; result->action.sprite_alpha = 1.f;
result->stamina_cap = 93; result->stamina_cap = 93;
result->stamina = result->stamina_cap;
result->hp_cap = DQN_CAST(uint32_t)(FP_DEFAULT_DAMAGE * .8f); result->hp_cap = DQN_CAST(uint32_t)(FP_DEFAULT_DAMAGE * .8f);
result->hp = result->hp_cap; result->hp = result->hp_cap;
@@ -291,19 +292,6 @@ static FP_GameEntity *FP_Game_MakeEntityPointerF(FP_Game *game, DQN_FMT_ATTRIB c
return result; return result;
} }
static FP_GameEntityHandle FP_Game_MakeEntityF(FP_Game *game, DQN_FMT_ATTRIB char const *fmt, ...)
{
va_list args;
va_start(args, fmt);
FP_GameEntity *entity = FP_Game_MakeEntityPointerF(game, fmt, args);
va_end(args);
FP_GameEntityHandle result = {};
if (entity)
result = entity->handle;
return result;
}
static bool FP_Game_IsNilEntity(FP_GameEntity *entity) static bool FP_Game_IsNilEntity(FP_GameEntity *entity)
{ {
bool result = entity ? ((entity->handle.id & FP_GAME_ENTITY_HANDLE_INDEX_MASK) == 0) : true; bool result = entity ? ((entity->handle.id & FP_GAME_ENTITY_HANDLE_INDEX_MASK) == 0) : true;
@@ -536,18 +524,6 @@ static void FP_Game_EntityActionReset(FP_Game *game, FP_GameEntityHandle entity_
entity->action.end_at_clock_ms = DQN_MAX(duration_ms, game->play.clock_ms + duration_ms); entity->action.end_at_clock_ms = DQN_MAX(duration_ms, game->play.clock_ms + duration_ms);
} }
static Dqn_V2I FP_Game_WorldPosToTilePos(FP_Game *game, Dqn_V2 world_pos)
{
Dqn_V2I result = Dqn_V2I_InitNx2(world_pos.x / game->play.tile_size, world_pos.y / game->play.tile_size);
return result;
}
static Dqn_V2 FP_Game_TilePosToWorldPos(FP_Game *game, Dqn_V2I tile_pos)
{
Dqn_V2 result = Dqn_V2_InitNx2(tile_pos.x * game->play.tile_size, tile_pos.y * game->play.tile_size);
return result;
}
static Dqn_V2 FP_Game_CalcWaypointWorldPos(FP_Game *game, FP_GameEntityHandle entity_handle, FP_GameWaypoint const *waypoint) static Dqn_V2 FP_Game_CalcWaypointWorldPos(FP_Game *game, FP_GameEntityHandle entity_handle, FP_GameWaypoint const *waypoint)
{ {
Dqn_V2 result = {}; Dqn_V2 result = {};
+48 -3
View File
@@ -168,8 +168,8 @@ enum FP_GameInGameMenu
struct FP_GameKeyBind struct FP_GameKeyBind
{ {
TELY_OSInputScanKey scan_key; TELY_InputScanKey scan_key;
TELY_OSInputGamepadKey gamepad_key; TELY_InputGamepadKey gamepad_key;
}; };
enum FP_GameControlMode enum FP_GameControlMode
@@ -334,12 +334,19 @@ enum FP_GameAudio
FP_GameAudio_Message, FP_GameAudio_Message,
FP_GameAudio_Monkey, FP_GameAudio_Monkey,
FP_GameAudio_PortalDestroy, FP_GameAudio_PortalDestroy,
FP_GameAudio_GameStart,
FP_GameAudio_PerryStart,
FP_GameAudio_Ambience1,
FP_GameAudio_Ambience2,
FP_GameAudio_Music1,
FP_GameAudio_Music2,
FP_GameAudio_Count, FP_GameAudio_Count,
}; };
enum FP_GameState enum FP_GameState
{ {
FP_GameState_IntroScreen, FP_GameState_IntroScreen,
FP_GameState_Tutorial,
FP_GameState_Play, FP_GameState_Play,
FP_GameState_Pause, FP_GameState_Pause,
FP_GameState_WinGame, FP_GameState_WinGame,
@@ -365,6 +372,35 @@ struct FP_Particle
Dqn_usize end_ms; Dqn_usize end_ms;
}; };
enum FP_GameStateTutorial
{
FP_GameStateTutorial_ShowPlayer,
FP_GameStateTutorial_ShowPlayerWait,
FP_GameStateTutorial_ShowPortalOne,
FP_GameStateTutorial_ShowPortalOneWait,
FP_GameStateTutorial_ShowPortalTwo,
FP_GameStateTutorial_ShowPortalTwoWait,
FP_GameStateTutorial_ShowPortalThree,
FP_GameStateTutorial_ShowPortalThreeWait,
FP_GameStateTutorial_ShowBillboardBuild,
FP_GameStateTutorial_ShowBillboardBuildWait,
FP_GameStateTutorial_Count,
};
Dqn_V2 const FP_MONKEY_SPAWN_LOCATIONS[] =
{
Dqn_V2_InitNx2(-592, 538),
Dqn_V2_InitNx2(-1503, -568),
Dqn_V2_InitNx2(1890, 1150),
Dqn_V2_InitNx2(1815, -1192),
Dqn_V2_InitNx2(520, 1230),
Dqn_V2_InitNx2(-934, -238),
Dqn_V2_InitNx2(1915, 15),
Dqn_V2_InitNx2(247, 560),
Dqn_V2_InitNx2(-290, -1120),
Dqn_V2_InitNx2(1126, -646),
};
struct FP_GamePlay struct FP_GamePlay
{ {
TELY_ChunkPool *chunk_pool; TELY_ChunkPool *chunk_pool;
@@ -388,6 +424,7 @@ struct FP_GamePlay
FP_GameEntityHandle merchant_graveyard; FP_GameEntityHandle merchant_graveyard;
FP_GameEntityHandle merchant_gym; FP_GameEntityHandle merchant_gym;
FP_GameEntityHandle merchant_phone_company; FP_GameEntityHandle merchant_phone_company;
FP_GameEntityHandle billboard_build;
FP_GameEntityHandle clicked_entity; FP_GameEntityHandle clicked_entity;
FP_GameEntityHandle hot_entity; FP_GameEntityHandle hot_entity;
@@ -429,6 +466,12 @@ struct FP_GamePlay
FP_Particle particles[256]; FP_Particle particles[256];
uint32_t particle_next_index; uint32_t particle_next_index;
FP_GameStateTutorial tutorial_state;
uint64_t tutorial_wait_end_time_ms;
uint8_t monkey_spawn_shuffled_list[DQN_ARRAY_UCOUNT(FP_MONKEY_SPAWN_LOCATIONS)];
uint8_t monkey_spawn_count;
}; };
struct FP_Game struct FP_Game
@@ -439,6 +482,8 @@ struct FP_Game
TELY_AssetFontHandle talkco_font; TELY_AssetFontHandle talkco_font;
TELY_AssetAudioHandle audio[FP_GameAudio_Count]; TELY_AssetAudioHandle audio[FP_GameAudio_Count];
TELY_AudioPlaybackHandle bg_music1;
TELY_AudioPlaybackHandle bg_music2;
TELY_AssetSpriteSheet atlas_sprite_sheet; TELY_AssetSpriteSheet atlas_sprite_sheet;
TELY_RFui rfui; TELY_RFui rfui;
FP_GamePlay play; FP_GamePlay play;
@@ -475,7 +520,7 @@ FP_GamePlaceableBuilding const PLACEABLE_BUILDINGS[] = {
{FP_EntityType_AirportTerry, FP_EntityAirportTerryState_Idle}, {FP_EntityType_AirportTerry, FP_EntityAirportTerryState_Idle},
{FP_EntityType_ChurchTerry, FP_EntityChurchTerryState_Idle}, {FP_EntityType_ChurchTerry, FP_EntityChurchTerryState_Idle},
{FP_EntityType_ClubTerry, FP_EntityClubTerryState_Idle}, {FP_EntityType_ClubTerry, FP_EntityClubTerryState_Idle},
{FP_EntityType_KennelTerry, FP_EntityKennelTerryState_Idle}, // {FP_EntityType_KennelTerry, FP_EntityKennelTerryState_Idle},
}; };
struct FP_GameCanMoveToPositionResult struct FP_GameCanMoveToPositionResult
+5 -3
View File
@@ -8,6 +8,8 @@
#define DQN_ONLY_DSMAP #define DQN_ONLY_DSMAP
#define DQN_ONLY_LIST #define DQN_ONLY_LIST
#define DQN_ONLY_FS #define DQN_ONLY_FS
#define DQN_ONLY_SEMAPHORE
#define DQN_ONLY_THREAD
#define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS
#define DQN_IMPLEMENTATION #define DQN_IMPLEMENTATION
#include "External/tely/External/dqn/dqn.h" #include "External/tely/External/dqn/dqn.h"
@@ -15,13 +17,13 @@
DQN_MSVC_WARNING_PUSH DQN_MSVC_WARNING_PUSH
DQN_MSVC_WARNING_DISABLE(4244) // warning C4244: 'argument': conversion from 'int' to 'short', possible loss of data DQN_MSVC_WARNING_DISABLE(4244) // warning C4244: 'argument': conversion from 'int' to 'short', possible loss of data
#define STB_RECT_PACK_IMPLEMENTATION #define STB_RECT_PACK_IMPLEMENTATION
#include "External/tely/external/stb/stb_rect_pack.h" #include "External/tely/External/stb/stb_rect_pack.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION #define STB_IMAGE_WRITE_IMPLEMENTATION
#include "External/tely/external/stb/stb_image_write.h" #include "External/tely/External/stb/stb_image_write.h"
#define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION
#include "External/tely/external/stb/stb_image.h" #include "External/tely/External/stb/stb_image.h"
DQN_MSVC_WARNING_POP DQN_MSVC_WARNING_POP
DQN_MSVC_WARNING_PUSH DQN_MSVC_WARNING_PUSH
+1 -1
View File
@@ -2,7 +2,7 @@
// Unity build header to compile the entire application as a single translation unit // Unity build header to compile the entire application as a single translation unit
#define TELY_PLATFORM_DLL_FILE_NAME "terry_cherry_dev_dll" #define TELY_PLATFORM_DLL_FILE_NAME "terry_cherry_dev_dll"
#include "External/tely/tely_os_raylib_unity.h" #include "External/tely/tely_backend_raylib_unity.h"
// NOTE: feely_pona ================================================================================ // NOTE: feely_pona ================================================================================
#if defined(_CLANGD) || defined(FEELY_PONA_IMPLEMENTATION) #if defined(_CLANGD) || defined(FEELY_PONA_IMPLEMENTATION)
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -25,7 +25,7 @@ forwards them to the command line).
You must ensure you have MSVC's `cl.exe` on your path to build. This game was You must ensure you have MSVC's `cl.exe` on your path to build. This game was
tested on MSVC 2023 (v14.34.31933). tested on MSVC 2023 (v14.34.31933).
For most intents and purposes you may simply execute `build.bat` on Windows For most intents and purposes you may simply execute `build_all.bat` on Windows
which bootstraps the build program and automatically calls the meta-build which bootstraps the build program and automatically calls the meta-build
program. With fast computers nowadays our default is to build all targets by program. With fast computers nowadays our default is to build all targets by
default (except web due to extra toolchain requirements). default (except web due to extra toolchain requirements).
@@ -57,7 +57,7 @@ then be done by
Tools\emsdk\emsdk.bat activate latest Tools\emsdk\emsdk.bat activate latest
# Build the game # Build the game
build --web build_all --web
``` ```
This will produce at `Build\Terry_Cherry_Emscripten` a HTML and WASM file ready This will produce at `Build\Terry_Cherry_Emscripten` a HTML and WASM file ready