diff --git a/README.md b/README.md index 165d909..f3bc455 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,6 @@ Where `/home/james/Blender/blender-2.93.1-linux-x64` is the folder where Blender
## Current New Feature TODO List -- [ ] force placing auto portals when there is a conflict - [ ] rotate auto uv - [ ] disable portal surfaces manually on some surfaces - [ ] Portal not rendering recursively sometimes @@ -135,6 +134,7 @@ Where `/home/james/Blender/blender-2.93.1-linux-x64` is the folder where Blender - [ ] Adding loading notice between levels #45 - [ ] Vertex lighting #39 - [ ] Multi controller support #23 +- [x] force placing auto portals when there is a conflict - [x] Camera shake - [x] Portal gun movement with player movement/shooting #19 diff --git a/src/scene/scene.c b/src/scene/scene.c index 4323a3c..c73c16c 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -197,6 +197,7 @@ void sceneInitNoPauseMenu(struct Scene* scene) { scene->last_portal_indx_shot=-1; scene->looked_wall_portalable_0=0; scene->looked_wall_portalable_1=0; + scene->continuouslyAttemptingPortalOpen=0; scene->freeCameraOffset = gZeroVec; @@ -284,6 +285,9 @@ void sceneCheckPortals(struct Scene* scene) { int hasBlue = (scene->player.flags & PlayerHasFirstPortalGun) != 0; int hasOrange = (scene->player.flags & PlayerHasSecondPortalGun) != 0; + if (scene->continuouslyAttemptingPortalOpen){ + sceneFirePortal(scene, &scene->savedPortal.ray, &scene->savedPortal.transformUp, scene->savedPortal.portalIndex, scene->savedPortal.roomIndex, 0, 0); + } if (fireOrange && hasOrange && !playerIsGrabbing(&scene->player)) { sceneFirePortal(scene, &raycastRay, &playerUp, 0, scene->player.body.currentRoom, 1, 0); @@ -334,7 +338,6 @@ void sceneCheckPortals(struct Scene* scene) { if (scene->player.flags & PlayerHasFirstPortalGun){ if (sceneFirePortal(scene, &raycastRay, &playerUp, 0, scene->player.body.currentRoom, 1, 1)){ - scene->looked_wall_portalable_0 = 1; } if (sceneFirePortal(scene, &raycastRay, &playerUp, 1, scene->player.body.currentRoom, 1, 1)){ @@ -766,7 +769,19 @@ int sceneFirePortal(struct Scene* scene, struct Ray* ray, struct Vector3* player quatLook(&hitDirection, &upDir, &portalLocation.rotation); } - return sceneOpenPortal(scene, &portalLocation, relativeIndex, portalIndex, mappingRange, hit.object, hit.roomIndex, fromPlayer, just_checking); + if (!sceneOpenPortal(scene, &portalLocation, relativeIndex, portalIndex, mappingRange, hit.object, hit.roomIndex, fromPlayer, just_checking) && !fromPlayer){ + sceneClosePortal(scene, 1-portalIndex); + scene->continuouslyAttemptingPortalOpen = 1; + scene->savedPortal.portalIndex = portalIndex; + scene->savedPortal.ray = *ray; + scene->savedPortal.roomIndex = roomIndex; + scene->savedPortal.transformUp = *playerUp; + return 0; + } + if (!fromPlayer){ + scene->continuouslyAttemptingPortalOpen = 0; + } + return 1; } void sceneClosePortal(struct Scene* scene, int portalIndex) { diff --git a/src/scene/scene.h b/src/scene/scene.h index b3cc152..d4b9f0d 100644 --- a/src/scene/scene.h +++ b/src/scene/scene.h @@ -22,6 +22,13 @@ #include "ball_catcher.h" #include "portal_gun.h" +struct SavedPortal{ + struct Ray ray; + struct Vector3 transformUp; + int portalIndex; + int roomIndex; +}; + struct Scene { struct Camera camera; struct Player player; @@ -41,6 +48,7 @@ struct Scene { struct CollisionObject* dynamicColliders; struct BallLauncher* ballLaunchers; struct BallCatcher* ballCatchers; + struct SavedPortal savedPortal; OSTime cpuTime; OSTime lastFrameStart; OSTime lastFrameTime; @@ -58,6 +66,7 @@ struct Scene { u8 last_portal_indx_shot; u8 looked_wall_portalable_0; u8 looked_wall_portalable_1; + u8 continuouslyAttemptingPortalOpen; }; extern struct Scene gScene;