Merge branch 'master' into portal-pedastal-fix

This commit is contained in:
Weston 2023-03-14 11:29:25 -05:00 committed by GitHub
commit d3f32ba5b2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 219 additions and 38 deletions

View file

@ -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

View file

@ -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

View file

@ -0,0 +1 @@
-alpha remove -crop 50x50+21+20 -resize 16x16

View file

@ -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

Binary file not shown.

View file

@ -0,0 +1 @@
-r 90,0,0 -m assets/materials/static.skm.yaml -m assets/materials/elevator.skm.yaml --default-material default --boneless

View file

@ -0,0 +1 @@
-c 1 -r 22050 -b 16

View file

@ -0,0 +1 @@
-c 1 -r 22050 -b 16

View file

@ -0,0 +1 @@
-c 1

View file

@ -0,0 +1 @@
-c 1

View file

@ -0,0 +1 @@
-c 1

View file

@ -0,0 +1 @@
-c 1

View file

@ -0,0 +1 @@
-c 1 -r 22050 -b 16

View file

@ -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;

View file

@ -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;

View file

@ -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);
}

View file

@ -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;
}

View file

@ -10,6 +10,8 @@ void savefileNew();
void savefileSetFlags(enum SavefileFlags flags);
void savefileUnsetFlags(enum SavefileFlags flags);
int savefileReadFlags(enum SavefileFlags flags);
#endif

View file

@ -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);

View file

@ -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;
}
}
}

View file

@ -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);

View file

@ -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);

View file

@ -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,7 +89,9 @@ 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;
}
}
}
@ -104,10 +111,8 @@ void signageCheckIndex(int neededIndex) {
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);
@ -117,7 +122,11 @@ void signageCheckIndex(int 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,6 +136,8 @@ void signageRender(void* data, struct DynamicRenderDataList* renderList, struct
transformToMatrixL(&signage->transform, matrix, SCENE_SCALE);
if (signOn){
dynamicRenderListAddData(
renderList,
props_signage_model_gfx,
@ -135,6 +146,20 @@ void signageRender(void* data, struct DynamicRenderDataList* renderList, struct
&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);

View file

@ -8,6 +8,7 @@ struct Signage {
struct Transform transform;
short roomIndex;
short testChamberNumber;
float flickerChance;
};
void signageInit(struct Signage* signage, struct SignageDefinition* definition);