From 15cd9cff3083a78fe6a2daff849877daf43dffb0 Mon Sep 17 00:00:00 2001 From: meep-eep Date: Sun, 24 Aug 2003 16:33:33 +0000 Subject: [PATCH] Fixed bug #108, extending chmmravatar's patch. Also added comments, and did some general cleanups. git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@1117 8092fc87-c524-0410-9efc-e669fe64eaf9 --- sc2/ChangeLog | 1 + sc2/src/sc2code/hyper.c | 58 +++++++++++++++++++++++++++-------------- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/sc2/ChangeLog b/sc2/ChangeLog index a6b5a7ae6..bb4aee9de 100644 --- a/sc2/ChangeLog +++ b/sc2/ChangeLog @@ -1,4 +1,5 @@ Changes towards version 0.3: +- Fixed bug with entering closing portals (bug #108) - SvdB+chmmravatar - Mouse cursor is now hidden in fullscreen mode (bug #173) -Mika - Version checks inside the input code to flag incompatible changes --Michael - Install location for content on unix systems is now ${prefix}/share/uqm diff --git a/sc2/src/sc2code/hyper.c b/sc2/src/sc2code/hyper.c index e6f0d1b62..b1a0514f0 100644 --- a/sc2/src/sc2code/hyper.c +++ b/sc2/src/sc2code/hyper.c @@ -452,7 +452,7 @@ unhyper_transition (PELEMENT ElementPtr) break; case INTERPLANETARY_TRANSITION: SET_GAME_STATE (USED_BROADCASTER, 0); - if (GET_GAME_STATE (ARILOU_SPACE_SIDE) == 0) + if (GET_GAME_STATE (ARILOU_SPACE_SIDE) <= 1) { GLOBAL (CurrentActivity) |= START_INTERPLANETARY; SET_GAME_STATE (ESCAPE_COUNTER, 0); @@ -505,32 +505,41 @@ unhyper_transition (PELEMENT ElementPtr) } break; case ARILOU_SPACE_TRANSITION: + /* Enter QuasiSpace from HyperSpace by any portal, + * or HyperSpace from QuasiSpace through the periodically + * opening portal. + */ SET_GAME_STATE (USED_BROADCASTER, 0); GLOBAL (autopilot.x) = GLOBAL (autopilot.y) = ~0; - if (GET_GAME_STATE (ARILOU_SPACE_SIDE) == 0) + if (GET_GAME_STATE (ARILOU_SPACE_SIDE) <= 1) { + // From HyperSpace to QuasiSpace. GLOBAL_SIS (log_x) = UNIVERSE_TO_LOGX (QUASI_SPACE_X); GLOBAL_SIS (log_y) = UNIVERSE_TO_LOGY (QUASI_SPACE_Y); if (GET_GAME_STATE (PORTAL_COUNTER) == 0) { - SET_GAME_STATE (ARILOU_SPACE_SIDE, 2); + // Periodically appearing portal. + SET_GAME_STATE (ARILOU_SPACE_SIDE, 3); } else { + // Player-induced portal. SET_GAME_STATE (PORTAL_COUNTER, 0); SET_GAME_STATE (ARILOU_SPACE_SIDE, 3); } } else { + // From QuasiSpace to HyperSpace through the + // periodically appearing portal. GLOBAL_SIS (log_x) = UNIVERSE_TO_LOGX (ARILOU_SPACE_X); GLOBAL_SIS (log_y) = UNIVERSE_TO_LOGY (ARILOU_SPACE_Y); - SET_GAME_STATE (ARILOU_SPACE_SIDE, 1); + SET_GAME_STATE (ARILOU_SPACE_SIDE, 0); } break; } @@ -1311,7 +1320,8 @@ void SeedUniverse (void) { COORD ox, oy; - COORD ux, uy, sx, sy, ex, ey; + COORD sx, sy, ex, ey; + SWORD portalCounter, arilouSpaceCounter, arilouSpaceSide; POINT universe; FRAME blip_frame; STAMP s; @@ -1344,8 +1354,8 @@ SeedUniverse (void) * RADAR_HEIGHT / RADAR_SCAN_HEIGHT) - (RADAR_HEIGHT >> 1); - ux = GET_GAME_STATE (ARILOU_SPACE_COUNTER); - uy = GET_GAME_STATE (ARILOU_SPACE_SIDE); + arilouSpaceCounter = GET_GAME_STATE (ARILOU_SPACE_COUNTER); + arilouSpaceSide = GET_GAME_STATE (ARILOU_SPACE_SIDE); // if (ox != ex || oy != ey) { @@ -1360,7 +1370,8 @@ SeedUniverse (void) ex = SDPtr->star_pt.x; ey = SDPtr->star_pt.y; star_type = STAR_TYPE (SDPtr->Type); - if (uy >= 2 && ex == ARILOU_HOME_X && ey == ARILOU_HOME_Y) + if (arilouSpaceSide >= 2 && + ex == ARILOU_HOME_X && ey == ARILOU_HOME_Y) star_type = SUPER_GIANT_STAR; s.origin.x = (COORD)((long)ex * RADAR_WIDTH @@ -1374,45 +1385,54 @@ SeedUniverse (void) } } - if ((ex = GET_GAME_STATE (PORTAL_COUNTER)) || ux) + portalCounter = GET_GAME_STATE (PORTAL_COUNTER); + if (portalCounter || arilouSpaceCounter) { COUNT i; STAR_DESC SD[2]; + // This array is filled with the STAR_DESC's of + // QuasiSpace portals that need to be taken into account. + // i is set the the number of active portals (max 2). i = 0; - if (ex) + if (portalCounter) { + // A player-created QuasiSpace portal is opening. static POINT portal_pt; - SD[i].Index = ((ex - 1) >> 1) + 18; - if (ex == 1) + SD[i].Index = ((portalCounter - 1) >> 1) + 18; + if (portalCounter == 1) portal_pt = universe; SD[i].star_pt = portal_pt; ++i; - if (++ex == (10 + 1)) - ex = (9 + 1); + if (++portalCounter == (10 + 1)) + portalCounter = (9 + 1); - SET_GAME_STATE (PORTAL_COUNTER, ex); + SET_GAME_STATE (PORTAL_COUNTER, portalCounter); } - if (ux) + if (arilouSpaceCounter) { - SD[i].Index = ux >> 1; - if (uy <= 1) + // The periodically appearing QuasiSpace portal is open. + SD[i].Index = arilouSpaceCounter >> 1; + if (arilouSpaceSide <= 1) { + // The player is in HyperSpace SD[i].Index += 18; SD[i].star_pt.x = ARILOU_SPACE_X; SD[i].star_pt.y = ARILOU_SPACE_Y; } else { + // The player is in QuasiSpace SD[i].star_pt.x = QUASI_SPACE_X; SD[i].star_pt.y = QUASI_SPACE_Y; } ++i; } + // Process the i portals from SD. do { --i; @@ -1451,7 +1471,7 @@ SeedUniverse (void) SetUpElement (HyperSpaceElementPtr); - if (uy == 1 || uy == 2) + if (arilouSpaceSide == 1 || arilouSpaceSide == 2) HyperSpaceElementPtr->death_func = arilou_space_death; else {