mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-20 10:37:37 -04:00
Merge branch 'master' into portal-pedastal-fix
This commit is contained in:
commit
d3f32ba5b2
16
Makefile
16
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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
-alpha remove -crop 50x50+21+20 -resize 16x16
|
|
@ -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
|
||||
|
|
BIN
assets/models/props/signage_off.blend
Normal file
BIN
assets/models/props/signage_off.blend
Normal file
Binary file not shown.
1
assets/models/props/signage_off.flags
Normal file
1
assets/models/props/signage_off.flags
Normal file
|
@ -0,0 +1 @@
|
|||
-r 90,0,0 -m assets/materials/static.skm.yaml -m assets/materials/elevator.skm.yaml --default-material default --boneless
|
1
assets/sound/common/wpn_denyselect.sox
Normal file
1
assets/sound/common/wpn_denyselect.sox
Normal file
|
@ -0,0 +1 @@
|
|||
-c 1 -r 22050 -b 16
|
1
assets/sound/common/wpn_select.sox
Normal file
1
assets/sound/common/wpn_select.sox
Normal file
|
@ -0,0 +1 @@
|
|||
-c 1 -r 22050 -b 16
|
1
assets/sound/player/footsteps/concrete1.sox
Normal file
1
assets/sound/player/footsteps/concrete1.sox
Normal file
|
@ -0,0 +1 @@
|
|||
-c 1
|
1
assets/sound/player/footsteps/concrete2.sox
Normal file
1
assets/sound/player/footsteps/concrete2.sox
Normal file
|
@ -0,0 +1 @@
|
|||
-c 1
|
1
assets/sound/player/footsteps/concrete3.sox
Normal file
1
assets/sound/player/footsteps/concrete3.sox
Normal file
|
@ -0,0 +1 @@
|
|||
-c 1
|
1
assets/sound/player/footsteps/concrete4.sox
Normal file
1
assets/sound/player/footsteps/concrete4.sox
Normal file
|
@ -0,0 +1 @@
|
|||
-c 1
|
1
assets/sound/player/suit_denydevice.sox
Normal file
1
assets/sound/player/suit_denydevice.sox
Normal file
|
@ -0,0 +1 @@
|
|||
-c 1 -r 22050 -b 16
|
BIN
assets/test_chambers/test_chamber_07/test_chamber_07.blend
Normal file
BIN
assets/test_chambers/test_chamber_07/test_chamber_07.blend
Normal file
Binary file not shown.
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -10,6 +10,8 @@ void savefileNew();
|
|||
|
||||
void savefileSetFlags(enum SavefileFlags flags);
|
||||
|
||||
void savefileUnsetFlags(enum SavefileFlags flags);
|
||||
|
||||
int savefileReadFlags(enum SavefileFlags flags);
|
||||
|
||||
#endif
|
|
@ -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);
|
||||
|
|
|
@ -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,15 @@ 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;
|
||||
|
||||
if (gCurrentLevelIndex == 0){
|
||||
player->flags &= ~PlayerHasFirstPortalGun;
|
||||
player->flags &= ~PlayerHasSecondPortalGun;
|
||||
savefileUnsetFlags(SavefileFlagsFirstPortalGun);
|
||||
savefileUnsetFlags(SavefileFlagsFirstPortalGun);
|
||||
}
|
||||
|
||||
// player->flags |= PlayerHasFirstPortalGun | PlayerHasSecondPortalGun;
|
||||
|
||||
|
@ -270,6 +280,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;
|
||||
|
@ -277,6 +288,12 @@ void playerUpdateGrabbedObject(struct Player* player) {
|
|||
player->grabbingThroughPortal = PLAYER_GRABBING_THROUGH_NOTHING;
|
||||
}
|
||||
}
|
||||
else{
|
||||
player->flags |= PlayerJustDeniedSelect;
|
||||
}
|
||||
}
|
||||
else{
|
||||
player->flags |= PlayerJustDeniedSelect;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -439,6 +456,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;
|
||||
|
@ -482,6 +500,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;
|
||||
|
@ -553,6 +600,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) {
|
||||
|
@ -675,4 +725,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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -261,6 +261,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);
|
||||
|
@ -288,6 +290,32 @@ void sceneCheckPortals(struct Scene* scene) {
|
|||
soundPlayerPlay(soundsPortalgunShoot[1], 1.0f, 1.0f, NULL, NULL);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
scene->looked_wall_portalable = 0;
|
||||
if (scene->player.flags & PlayerHasFirstPortalGun){
|
||||
if (sceneFirePortal(scene, &raycastRay, &playerUp, 1, scene->player.body.currentRoom, 1, 1)){
|
||||
|
@ -631,6 +659,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);
|
||||
|
||||
|
|
|
@ -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 <stdlib.h>
|
||||
|
||||
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;
|
||||
int tenDigit = neededIndex / 10;
|
||||
int oneDigit = neededIndex - tenDigit * 10;
|
||||
|
||||
gCurrentSignageIndex = neededIndex;
|
||||
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);
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ struct Signage {
|
|||
struct Transform transform;
|
||||
short roomIndex;
|
||||
short testChamberNumber;
|
||||
float flickerChance;
|
||||
};
|
||||
|
||||
void signageInit(struct Signage* signage, struct SignageDefinition* definition);
|
||||
|
|
Loading…
Reference in a new issue