diff --git a/Makefile b/Makefile index 42e7c69..c8cde24 100644 --- a/Makefile +++ b/Makefile @@ -21,8 +21,8 @@ OPTIMIZER := -O0 LCDEFS := -DDEBUG -g -Isrc/ -I/usr/include/n64/nustd -Werror -Wall N64LIB := -lultra_rom -lnustd -ifeq ($(WITH_DEBUGGER),1) -LCDEFS += -DWITH_DEBUGGER +ifeq ($(PORTAL64_WITH_DEBUGGER),1) +LCDEFS += -DPORTAL64_WITH_DEBUGGER endif BASE_TARGET_NAME = build/portal @@ -36,8 +36,8 @@ ASMOBJECTS = $(patsubst %.s, build/%.o, $(ASMFILES)) CODEFILES = $(shell find src/ -type f -name '*.c') -ifeq ($(WITH_GFX_VALIDATOR),1) -LCDEFS += -DWITH_GFX_VALIDATOR +ifeq ($(PORTAL64_WITH_GFX_VALIDATOR),1) +LCDEFS += -DPORTAL64_WITH_GFX_VALIDATOR CODEFILES += gfxvalidator/validator.c gfxvalidator/error_printer.c gfxvalidator/command_printer.c endif @@ -175,6 +175,7 @@ MODEL_LIST = assets/models/cube/cube.blend \ assets/models/props/round_elevator_interior.blend \ assets/models/props/round_elevator_collision.blend \ assets/models/props/signage.blend \ + assets/models/props/signage_off.blend \ assets/models/props/switch001.blend \ assets/models/props/box_dropper.blend \ assets/models/props/box_dropper_glass.blend \ @@ -251,7 +252,8 @@ TEST_CHAMBERS = assets/test_chambers/test_chamber_00/test_chamber_00.blend \ assets/test_chambers/test_chamber_03/test_chamber_03.blend \ assets/test_chambers/test_chamber_04/test_chamber_04.blend \ assets/test_chambers/test_chamber_05/test_chamber_05.blend \ - assets/test_chambers/test_chamber_06/test_chamber_06.blend + assets/test_chambers/test_chamber_06/test_chamber_06.blend \ + assets/test_chambers/test_chamber_07/test_chamber_07.blend TEST_CHAMBER_HEADERS = $(TEST_CHAMBERS:%.blend=build/%.h) TEST_CHAMBER_OBJECTS = $(TEST_CHAMBERS:%.blend=build/%_geo.o) @@ -350,7 +352,7 @@ CODEOBJECTS = $(patsubst %.c, build/%.o, $(CODEFILES)) $(MODEL_OBJECTS) build/as CODEOBJECTS_NO_DEBUG = $(CODEOBJECTS) -ifeq ($(WITH_DEBUGGER),1) +ifeq ($(PORTAL64_WITH_DEBUGGER),1) CODEOBJECTS_NO_DEBUG += build/debugger/debugger_stub.o build/debugger/serial.o endif @@ -369,7 +371,7 @@ $(BASE_TARGET_NAME).z64: $(CODESEGMENT)_no_debug.o $(OBJECTS) $(CP_LD_SCRIPT)_no # with debugger CODEOBJECTS_DEBUG = $(CODEOBJECTS) -ifeq ($(WITH_DEBUGGER),1) +ifeq ($(PORTAL64_WITH_DEBUGGER),1) CODEOBJECTS_DEBUG += build/debugger/debugger.o build/debugger/serial.o endif diff --git a/README.md b/README.md index bed10fe..5e2f8cc 100644 --- a/README.md +++ b/README.md @@ -110,9 +110,9 @@ Where `/home/james/Blender/blender-2.93.1-linux-x64` is the folder where Blender - [ ] Correct elevator timing - [ ] Elevator and door sounds - [ ] Presort portal gun polygon order -- [ ] Signage should not always be on - [ ] Camera shake - [?] Skips audio sometimes +- [x] Signage should not always be on - [x] sound effects for ball (portal_pak_dir/scripts/npc_sounds_energy_ball.txt) - [x] first portal wall - [x] the cube bounces the player diff --git a/assets/materials/models/props_animsigns/newsignage_back00.ims b/assets/materials/models/props_animsigns/newsignage_back00.ims new file mode 100644 index 0000000..4a85d83 --- /dev/null +++ b/assets/materials/models/props_animsigns/newsignage_back00.ims @@ -0,0 +1 @@ +-alpha remove -crop 50x50+21+20 -resize 16x16 \ No newline at end of file diff --git a/assets/materials/static.skm.yaml b/assets/materials/static.skm.yaml index 7e64103..9618600 100644 --- a/assets/materials/static.skm.yaml +++ b/assets/materials/static.skm.yaml @@ -407,6 +407,22 @@ materials: gDPSetCombineMode: color: ["SHADE", "0", "TEXEL0", "0"] + newsignage_back00: + gDPSetTile: + filename: ../../portal_pak_modified/materials/models/props_animsigns/newsignage_back00.png + siz: G_IM_SIZ_4b + twoTone: true + s: + wrap: false + t: + wrap: false + + gDPSetRenderMode: G_RM_ZB_OPA_SURF + + gSPGeometryMode: + clear: [G_LIGHTING] + gDPSetCycleType: G_CYC_1CYCLE + newsignage_back02: gDPSetTile: filename: ../../portal_pak_modified/materials/models/props_animsigns/newsignage_back02.png diff --git a/assets/models/props/signage_off.blend b/assets/models/props/signage_off.blend new file mode 100644 index 0000000..73b1e9b Binary files /dev/null and b/assets/models/props/signage_off.blend differ diff --git a/assets/models/props/signage_off.flags b/assets/models/props/signage_off.flags new file mode 100644 index 0000000..ed29780 --- /dev/null +++ b/assets/models/props/signage_off.flags @@ -0,0 +1 @@ +-r 90,0,0 -m assets/materials/static.skm.yaml -m assets/materials/elevator.skm.yaml --default-material default --boneless \ No newline at end of file diff --git a/assets/sound/common/wpn_denyselect.sox b/assets/sound/common/wpn_denyselect.sox new file mode 100644 index 0000000..c86a899 --- /dev/null +++ b/assets/sound/common/wpn_denyselect.sox @@ -0,0 +1 @@ +-c 1 -r 22050 -b 16 \ No newline at end of file diff --git a/assets/sound/common/wpn_select.sox b/assets/sound/common/wpn_select.sox new file mode 100644 index 0000000..9400c22 --- /dev/null +++ b/assets/sound/common/wpn_select.sox @@ -0,0 +1 @@ +-c 1 -r 22050 -b 16 \ No newline at end of file diff --git a/assets/sound/player/footsteps/concrete1.sox b/assets/sound/player/footsteps/concrete1.sox new file mode 100644 index 0000000..86f4847 --- /dev/null +++ b/assets/sound/player/footsteps/concrete1.sox @@ -0,0 +1 @@ +-c 1 \ No newline at end of file diff --git a/assets/sound/player/footsteps/concrete2.sox b/assets/sound/player/footsteps/concrete2.sox new file mode 100644 index 0000000..86f4847 --- /dev/null +++ b/assets/sound/player/footsteps/concrete2.sox @@ -0,0 +1 @@ +-c 1 \ No newline at end of file diff --git a/assets/sound/player/footsteps/concrete3.sox b/assets/sound/player/footsteps/concrete3.sox new file mode 100644 index 0000000..86f4847 --- /dev/null +++ b/assets/sound/player/footsteps/concrete3.sox @@ -0,0 +1 @@ +-c 1 \ No newline at end of file diff --git a/assets/sound/player/footsteps/concrete4.sox b/assets/sound/player/footsteps/concrete4.sox new file mode 100644 index 0000000..86f4847 --- /dev/null +++ b/assets/sound/player/footsteps/concrete4.sox @@ -0,0 +1 @@ +-c 1 \ No newline at end of file diff --git a/assets/sound/player/suit_denydevice.sox b/assets/sound/player/suit_denydevice.sox new file mode 100644 index 0000000..c86a899 --- /dev/null +++ b/assets/sound/player/suit_denydevice.sox @@ -0,0 +1 @@ +-c 1 -r 22050 -b 16 \ No newline at end of file diff --git a/assets/test_chambers/test_chamber_07/test_chamber_07.blend b/assets/test_chambers/test_chamber_07/test_chamber_07.blend new file mode 100644 index 0000000..68c1a46 Binary files /dev/null and b/assets/test_chambers/test_chamber_07/test_chamber_07.blend differ diff --git a/src/audio/clips.c b/src/audio/clips.c index 398e699..002422a 100644 --- a/src/audio/clips.c +++ b/src/audio/clips.c @@ -19,6 +19,19 @@ unsigned short soundsPortalgunShoot[2] = { SOUNDS_PORTALGUN_SHOOT_BLUE1, }; +unsigned short soundsConcreteFootstep[4] = { + SOUNDS_CONCRETE1, //left foot + SOUNDS_CONCRETE2, //right foot + SOUNDS_CONCRETE3, //land + SOUNDS_CONCRETE4, //jump +}; + +unsigned short soundsSelecting[3] = { + SOUNDS_WPN_DENYSELECT, + SOUNDS_WPN_SELECT, + SOUNDS_SUIT_DENYDEVICE, +}; + unsigned short soundsPortalOpen2 = SOUNDS_PORTAL_OPEN2; unsigned short soundsPortalFizzle = SOUNDS_PORTAL_FIZZLE2; diff --git a/src/audio/clips.h b/src/audio/clips.h index 05df5f3..3e0b346 100644 --- a/src/audio/clips.h +++ b/src/audio/clips.h @@ -5,6 +5,9 @@ extern unsigned short soundsPortalEnter[2]; extern unsigned short soundsPortalExit[2]; extern unsigned short soundsPortalgunShoot[2]; +extern unsigned short soundsConcreteFootstep[4]; +extern unsigned short soundsSelecting[3]; + extern unsigned short soundsPortalOpen2; diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index dbdd00d..f50d8f5 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -11,11 +11,11 @@ extern OSMesgQueue *schedulerCommandQueue; void* gLevelSegment; -#if WITH_GFX_VALIDATOR +#if PORTAL64_WITH_GFX_VALIDATOR #include "../../gfxvalidator/validator.h" #endif -#if WITH_DEBUGGER +#if PORTAL64_WITH_DEBUGGER #include "../../debugger/debugger.h" #include "../../debugger/serial.h" @@ -124,8 +124,8 @@ void graphicsCreateTask(struct GraphicsTask* targetTask, GraphicsCallback callba scTask->next = 0; scTask->state = 0; -#if WITH_GFX_VALIDATOR -#if WITH_DEBUGGER +#if PORTAL64_WITH_GFX_VALIDATOR +#if PORTAL64_WITH_DEBUGGER struct GFXValidationResult validationResult; zeroMemory(&validationResult, sizeof(struct GFXValidationResult)); @@ -134,8 +134,8 @@ void graphicsCreateTask(struct GraphicsTask* targetTask, GraphicsCallback callba gdbBreak(); } -#endif // WITH_DEBUGGER -#endif // WITH_GFX_VALIDATOR +#endif // PORTAL64_WITH_DEBUGGER +#endif // PORTAL64_WITH_GFX_VALIDATOR osSendMesg(schedulerCommandQueue, (OSMesg)scTask, OS_MESG_BLOCK); } \ No newline at end of file diff --git a/src/levels/savefile.c b/src/levels/savefile.c index abc06bd..da91c11 100644 --- a/src/levels/savefile.c +++ b/src/levels/savefile.c @@ -17,6 +17,10 @@ void savefileSetFlags(enum SavefileFlags flags) { gCurrentSave.flags |= flags; } +void savefileUnsetFlags(enum SavefileFlags flags) { + gCurrentSave.flags &= ~flags; +} + int savefileReadFlags(enum SavefileFlags flags) { return gCurrentSave.flags & flags; } \ No newline at end of file diff --git a/src/levels/savefile.h b/src/levels/savefile.h index 895ef81..4f91b67 100644 --- a/src/levels/savefile.h +++ b/src/levels/savefile.h @@ -10,6 +10,8 @@ void savefileNew(); void savefileSetFlags(enum SavefileFlags flags); +void savefileUnsetFlags(enum SavefileFlags flags); + int savefileReadFlags(enum SavefileFlags flags); #endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index 792c2b7..5fa4c5d 100644 --- a/src/main.c +++ b/src/main.c @@ -22,7 +22,7 @@ #include "levels/levels.h" #include "levels/checkpoint.h" -#ifdef WITH_DEBUGGER +#ifdef PORTAL64_WITH_DEBUGGER #include "../debugger/debugger.h" #endif @@ -151,7 +151,7 @@ static void gameProc(void* arg) { heapInit(_heapStart, memoryEnd); romInit(); -#ifdef WITH_DEBUGGER +#ifdef PORTAL64_WITH_DEBUGGER OSThread* debugThreads[2]; debugThreads[0] = &gameThread; gdbInitDebugger(gPiHandle, &dmaMessageQ, debugThreads, 1); diff --git a/src/player/player.c b/src/player/player.c index 7536e96..2edfa99 100644 --- a/src/player/player.c +++ b/src/player/player.c @@ -21,6 +21,7 @@ #define GRAB_RAYCAST_DISTANCE 2.5f #define DROWN_TIME 2.0f +#define STEP_TIME 0.35f #define STAND_SPEED 1.5f @@ -132,6 +133,8 @@ void playerInit(struct Player* player, struct Location* startLocation, struct Ve player->pitchVelocity = 0.0f; player->yawVelocity = 0.0f; player->flags = 0; + player->stepTimer = STEP_TIME; + player->currentFoot = 0; int saveFlags = savefileReadFlags(SavefileFlagsFirstPortalGun | SavefileFlagsSecondPortalGun); @@ -143,6 +146,12 @@ void playerInit(struct Player* player, struct Location* startLocation, struct Ve player->flags |= PlayerHasSecondPortalGun; } + if (gCurrentLevelIndex == 0){ + player->flags &= ~PlayerHasFirstPortalGun; + player->flags &= ~PlayerHasSecondPortalGun; + savefileUnsetFlags(SavefileFlagsFirstPortalGun); + savefileUnsetFlags(SavefileFlagsFirstPortalGun); + } // player->flags |= PlayerHasFirstPortalGun | PlayerHasSecondPortalGun; @@ -285,6 +294,7 @@ void playerUpdateGrabbedObject(struct Player* player) { if (hit.object->body && (hit.object->body->flags & RigidBodyFlagsGrabbable)) { playerSetGrabbing(player, hit.object); + player->flags |= PlayerJustSelect; if (hit.throughPortal) { player->grabbingThroughPortal = hit.throughPortal == gCollisionScene.portalTransforms[0] ? 0 : 1; @@ -292,6 +302,12 @@ void playerUpdateGrabbedObject(struct Player* player) { player->grabbingThroughPortal = PLAYER_GRABBING_THROUGH_NOTHING; } } + else{ + player->flags |= PlayerJustDeniedSelect; + } + } + else{ + player->flags |= PlayerJustDeniedSelect; } } } @@ -462,6 +478,7 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) { if (!isDead && (player->flags & PlayerFlagsGrounded) && controllerGetButtonDown(0, A_BUTTON)) { player->body.velocity.y = JUMP_IMPULSE; + player->flags |= PlayerJustJumped; } struct Vector3 targetVelocity = gZeroVec; @@ -505,6 +522,35 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) { collisionSceneAddDynamicObject(&player->collisionObject); collisionObjectUpdateBB(&player->collisionObject); } + + //look straight forward + if (controllerGetButtonDown(0, U_CBUTTONS)){ + struct Vector3 lookingForward; + vector3Negate(&gForward, &lookingForward); + quatMultVector(&player->lookTransform.rotation, &lookingForward, &lookingForward); + if (fabsf(lookingForward.y) < 0.999f) { + lookingForward.y = 0; + quatLook(&lookingForward, &gUp, &player->lookTransform.rotation); + } + } + //look behind + if (controllerGetButtonDown(0, D_CBUTTONS)){ + struct Vector3 lookingForward; + vector3Negate(&gForward, &lookingForward); + quatMultVector(&player->lookTransform.rotation, &lookingForward, &lookingForward); + if (fabsf(lookingForward.y) < 0.999f) { + lookingForward.y = 0; + quatLook(&lookingForward, &gUp, &player->lookTransform.rotation); + //look directly behind + struct Quaternion behindRotation; + behindRotation.x=(player->lookTransform.rotation.z); + behindRotation.y=player->lookTransform.rotation.w; + behindRotation.z=(-1.0f*player->lookTransform.rotation.x); + behindRotation.w=(-1.0f*player->lookTransform.rotation.y); + + player->lookTransform.rotation = behindRotation; + } + } } targetVelocity.y = player->body.velocity.y; @@ -576,6 +622,9 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) { } hit.object->flags |= COLLISION_OBJECT_PLAYER_STANDING; + if (!(player->flags & PlayerFlagsGrounded)){ + player->flags |= PlayerJustLanded; + } player->flags |= PlayerFlagsGrounded; if (hit.object == player->grabConstraint.object) { @@ -698,4 +747,21 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) { playerKill(player, 0); } } + + // player not moving on ground + if ((player->flags & PlayerFlagsGrounded) && (player->body.velocity.x == 0) && (player->body.velocity.z == 0)){ + player->stepTimer = STEP_TIME; + player->flags &= ~PlayerIsStepping; + } + // player moving on ground + else{ + player->stepTimer -= FIXED_DELTA_TIME; + + if (player->stepTimer < 0.0f) { + player->flags |= PlayerIsStepping; + player->stepTimer = STEP_TIME; + player->currentFoot = !player->currentFoot; + } + } + } diff --git a/src/player/player.h b/src/player/player.h index cb44aa1..b655309 100644 --- a/src/player/player.h +++ b/src/player/player.h @@ -22,6 +22,11 @@ enum PlayerFlags { PlayerIsDead = (1 << 3), PlayerIsUnderwater = (1 << 4), PlayerCrouched = (1 << 5), + PlayerIsStepping = (1 << 6), + PlayerJustJumped = (1 << 7), + PlayerJustLanded = (1 << 8), + PlayerJustSelect = (1 << 9), + PlayerJustDeniedSelect = (1 << 10), }; struct Player { @@ -40,6 +45,8 @@ struct Player { struct Vector3 relativeAnchor; struct Vector3 lastAnchorPoint; float drownTimer; + float stepTimer; + int currentFoot; //left=0, right=1 }; void playerInit(struct Player* player, struct Location* startLocation, struct Vector3* velocity); diff --git a/src/scene/scene.c b/src/scene/scene.c index 6e55398..70aa7ba 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -260,6 +260,8 @@ void sceneRender(struct Scene* scene, struct RenderState* renderState, struct Gr // contactSolverDebugDraw(&gContactSolver, renderState); } + + void sceneCheckPortals(struct Scene* scene) { if (playerIsDead(&scene->player)) { sceneClosePortal(scene, 0); @@ -287,8 +289,36 @@ void sceneCheckPortals(struct Scene* scene) { soundPlayerPlay(soundsPortalgunShoot[1], 1.0f, 1.0f, NULL, NULL); } + scene->looked_wall_portalable_0 = 0; scene->looked_wall_portalable_1 = 0; + + if ((scene->player.flags & PlayerFlagsGrounded) && (scene->player.flags & PlayerIsStepping)){ + soundPlayerPlay(soundsConcreteFootstep[scene->player.currentFoot], 1.0f, 1.0f, NULL, NULL); + scene->player.flags &= ~PlayerIsStepping; + } + if (scene->player.flags & PlayerJustJumped){ + soundPlayerPlay(soundsConcreteFootstep[3], 1.0f, 1.0f, NULL, NULL); + scene->player.flags &= ~PlayerJustJumped; + } + if (scene->player.flags & PlayerJustLanded){ + soundPlayerPlay(soundsConcreteFootstep[2], 1.0f, 1.0f, NULL, NULL); + scene->player.flags &= ~PlayerJustLanded; + } + if (scene->player.flags & PlayerJustSelect){ + soundPlayerPlay(soundsSelecting[1], 1.0f, 0.5f, NULL, NULL); + scene->player.flags &= ~PlayerJustSelect; + } + if (scene->player.flags & PlayerJustDeniedSelect){ + if (scene->player.flags & PlayerHasFirstPortalGun){ + soundPlayerPlay(soundsSelecting[0], 1.0f, 0.5f, NULL, NULL); + } + else{ + soundPlayerPlay(soundsSelecting[2], 1.0f, 0.5f, NULL, NULL); + } + scene->player.flags &= ~PlayerJustDeniedSelect; + } + if (scene->player.flags & PlayerHasFirstPortalGun){ if (sceneFirePortal(scene, &raycastRay, &playerUp, 0, scene->player.body.currentRoom, 1, 1)){ scene->looked_wall_portalable_0 = 1; @@ -634,6 +664,9 @@ int sceneDynamicBoxIndex(struct Scene* scene, struct CollisionObject* hitObject) return hitObject - scene->dynamicColliders; } + + + int sceneDetermineSurfaceMapping(struct Scene* scene, struct CollisionObject* hitObject, struct PortalSurfaceMappingRange* mappingRangeOut, int* relativeToOut) { int quadIndex = levelQuadIndex(hitObject); diff --git a/src/scene/signage.c b/src/scene/signage.c index 0abbf74..a6f454e 100644 --- a/src/scene/signage.c +++ b/src/scene/signage.c @@ -6,9 +6,13 @@ #include "../graphics/color.h" #include "../build/assets/models/props/signage.h" +#include "../build/assets/models/props/signage_off.h" #include "../build/assets/models/props/cylinder_test.h" #include "../../build/assets/materials/static.h" + +#include + int gCurrentSignageIndex = -1; void signageSetLargeDigit(Vtx* vertices, int nextDigit, int currentDigit) { @@ -70,6 +74,7 @@ short gLevelWarnings[] = { LevelWarningsBallHit | LevelWarningsBallCollect, LevelWarningsBallHit | LevelWarningsBallCollect | LevelWarningsLiquid | LevelWarningsDrinking, LevelWarningsCubeDispense | LevelWarningsCubeHit, + LevelWarningsSpeedyIn | LevelWarningsSpeedyOut, }; static struct Coloru8 gSignageOnColor = {0, 0, 0, 255}; @@ -84,40 +89,44 @@ void signageSetWarnings(int warningMask) { ((Vtx*)K0_TO_K1(gWarningVertices[i]))[vIndex].v.cn[1] = useColor.g; ((Vtx*)K0_TO_K1(gWarningVertices[i]))[vIndex].v.cn[2] = useColor.b; ((Vtx*)K0_TO_K1(gWarningVertices[i]))[vIndex].v.cn[3] = useColor.a; + } + } } void signageCheckIndex(int neededIndex) { - if (gCurrentSignageIndex == neededIndex) { - return; - } + if (gCurrentSignageIndex == neededIndex) { + return; + } - if (gCurrentSignageIndex == -1) { - gCurrentSignageIndex = 0; - } + if (gCurrentSignageIndex == -1) { + gCurrentSignageIndex = 0; + } - int prevTenDigit = gCurrentSignageIndex / 10; - int prevOneDigit = gCurrentSignageIndex - prevTenDigit * 10; + int prevTenDigit = gCurrentSignageIndex / 10; + int prevOneDigit = gCurrentSignageIndex - prevTenDigit * 10; - int tenDigit = neededIndex / 10; - int oneDigit = neededIndex - tenDigit * 10; - - gCurrentSignageIndex = neededIndex; + int tenDigit = neededIndex / 10; + int oneDigit = neededIndex - tenDigit * 10; + + gCurrentSignageIndex = neededIndex; + signageSetLargeDigit(props_signage_signage_num00_digit_0_color, oneDigit, prevOneDigit); + signageSetLargeDigit(props_signage_signage_num00_digit_10_color, tenDigit, prevTenDigit); + signageSetSmallDigit(props_signage_signage_num00_sdigit_0_color, oneDigit, prevOneDigit); + signageSetSmallDigit(props_signage_signage_num00_sdigit_10_color, tenDigit, prevTenDigit); - signageSetLargeDigit(props_signage_signage_num00_digit_0_color, oneDigit, prevOneDigit); - signageSetLargeDigit(props_signage_signage_num00_digit_10_color, tenDigit, prevTenDigit); - - signageSetSmallDigit(props_signage_signage_num00_sdigit_0_color, oneDigit, prevOneDigit); - signageSetSmallDigit(props_signage_signage_num00_sdigit_10_color, tenDigit, prevTenDigit); - - signageSetWarnings(gLevelWarnings[neededIndex]); + signageSetWarnings(gLevelWarnings[neededIndex]); } void signageRender(void* data, struct DynamicRenderDataList* renderList, struct RenderState* renderState) { struct Signage* signage = (struct Signage*)data; - signageCheckIndex(signage->testChamberNumber); + float n = ((float)rand()/RAND_MAX)*(float)(1.0); + int signOn = 1; + if (n <= signage->flickerChance){signOn = 0;} + if (signage->flickerChance > 0.0001){signage->flickerChance = signage->flickerChance*0.97;} + if (signOn){signageCheckIndex(signage->testChamberNumber);} Mtx* matrix = renderStateRequestMatrices(renderState, 1); @@ -127,14 +136,30 @@ void signageRender(void* data, struct DynamicRenderDataList* renderList, struct transformToMatrixL(&signage->transform, matrix, SCENE_SCALE); - dynamicRenderListAddData( + + if (signOn){ + dynamicRenderListAddData( renderList, props_signage_model_gfx, matrix, DEFAULT_INDEX, &signage->transform.position, NULL - ); + ); + } + else{ + dynamicRenderListAddData( + renderList, + props_signage_off_model_gfx, + matrix, + DEFAULT_INDEX, + &signage->transform.position, + NULL + ); + } + + + } void signageInit(struct Signage* signage, struct SignageDefinition* definition) { @@ -143,6 +168,7 @@ void signageInit(struct Signage* signage, struct SignageDefinition* definition) signage->transform.scale = gOneVec; signage->roomIndex = definition->roomIndex; signage->testChamberNumber = definition->testChamberNumber; + signage->flickerChance = 1.0; int dynamicId = dynamicSceneAdd(signage, signageRender, &signage->transform.position, 1.7f); diff --git a/src/scene/signage.h b/src/scene/signage.h index 9494356..16c7957 100644 --- a/src/scene/signage.h +++ b/src/scene/signage.h @@ -8,6 +8,7 @@ struct Signage { struct Transform transform; short roomIndex; short testChamberNumber; + float flickerChance; }; void signageInit(struct Signage* signage, struct SignageDefinition* definition);