// Create a frame for each player to display their current fleet in, // to be used when selecting the next ship to fight with. void BuildPickMeleeFrame (void) { STAMP s; CONTEXT OldContext = SetContext (OffScreenContext); if (PickMeleeFrame) DestroyDrawable (ReleaseDrawable (PickMeleeFrame)); PickMeleeFrame = CaptureDrawable (CreateDrawable ( WANT_PIXMAP, MELEE_WIDTH, MELEE_HEIGHT, 2)); s.origin.x = 0; s.origin.y = 0; s.frame = CaptureDrawable (LoadGraphic (MELEE_PICK_MASK_PMAP_ANIM)); SetContextFGFrame (PickMeleeFrame); DrawStamp (&s); s.frame = IncFrameIndex (s.frame); SetContextFGFrame (IncFrameIndex (PickMeleeFrame)); DrawStamp (&s); DestroyDrawable (ReleaseDrawable (s.frame)); SetContext (OldContext); }
// draws the oscilloscope void DrawOscilloscope (void) { STAMP s; BYTE scope_data[128]; if (oscillDisabled) return; assert ((size_t)scopeSize.width <= sizeof scope_data); assert (scopeSize.height < 256); if (GraphForegroundStream (scope_data, scopeSize.width, scopeSize.height)) { int i; CONTEXT oldContext; oldContext = SetContext (OffScreenContext); SetContextFGFrame (scopeWork); SetContextClipRect (NULL); // draw the background image s.origin.x = 0; s.origin.y = 0; s.frame = scope_frame; DrawStamp (&s); // draw the scope lines SetContextForeGroundColor (scopeColor); for (i = 0; i < scopeSize.width - 1; ++i) { LINE line; line.first.x = i + 1; line.first.y = scope_data[i] + 1; line.second.x = i + 2; line.second.y = scope_data[i + 1] + 1; DrawLine (&line); } SetContext (oldContext); s.frame = scopeWork; } else { // no data -- draw blank scope background s.frame = scope_frame; } // draw the final scope image to screen s.origin.x = 0; s.origin.y = 0; DrawStamp (&s); }
void InitSISContexts (void) { RECT r; SetContext (StatusContext); SetContext (SpaceContext); SetContextFGFrame (Screen); r.corner.x = SIS_ORG_X; r.corner.y = SIS_ORG_Y; r.extent.width = SIS_SCREEN_WIDTH; r.extent.height = SIS_SCREEN_HEIGHT; SetContextClipRect (&r); }
// Cross out the icon for the dead ship. // 'frame' is the PickMeleeFrame for the player. // 'shipI' is the index in the ship list. // Pre: caller holds the graphics lock. static void CrossOutShip (FRAME frame, COUNT shipNr) { CONTEXT OldContext; STAMP s; BYTE row = PickMelee_GetShipRow (shipNr); BYTE col = PickMelee_GetShipColumn (shipNr); OldContext = SetContext (OffScreenContext); SetContextFGFrame (frame); s.origin.x = RES_SCALE(3) + ((ICON_WIDTH + RES_SCALE(2)) * col); // JMS_GFX s.origin.y = RES_SCALE(9) + ((ICON_HEIGHT + RES_SCALE(2)) * row); // JMS_GFX s.frame = SetAbsFrameIndex (StatusFrame, 3); // Cross for through the ship image. DrawStamp (&s); SetContext (OldContext); }
static void CreatePlanetContext (void) { CONTEXT oldContext; RECT r; assert (PlanetContext == NULL); LockMutex (GraphicsLock); // PlanetContext rect is relative to SpaceContext oldContext = SetContext (SpaceContext); GetContextClipRect (&r); PlanetContext = CreateContext ("PlanetContext"); SetContext (PlanetContext); SetContextFGFrame (Screen); r.extent.height -= MAP_HEIGHT + MAP_BORDER_HEIGHT; SetContextClipRect (&r); SetContext (oldContext); UnlockMutex (GraphicsLock); }
// Draw the value of the fleet in the top right of the PickMeleeFrame. // Pre: caller holds the graphics lock. static void UpdatePickMeleeFleetValue (FRAME frame, COUNT which_player) { CONTEXT OldContext; COUNT value; RECT r; TEXT t; UNICODE buf[40]; value = GetRaceQueueValue (&race_q[which_player]); OldContext = SetContext (OffScreenContext); SetContextFGFrame (frame); // Erase the old value text. GetFrameRect (frame, &r); r.extent.width -= RES_SCALE(4); t.baseline.x = r.extent.width; r.corner.x = r.extent.width - RES_SCALE(6 * 3); // JMS_GFX r.corner.y = RES_SCALE(2); // JMS_GFX r.extent.width = RES_SCALE(6 * 3); // JMS_GFX r.extent.height = RES_SCALE(7 - 2) + RESOLUTION_FACTOR; // JMS_GFX SetContextForeGroundColor (PICK_BG_COLOR); DrawFilledRectangle (&r); // Draw the new value text. sprintf (buf, "%d", value); t.baseline.y = RES_SCALE(7); t.align = ALIGN_RIGHT; t.pStr = buf; t.CharCount = (COUNT)~0; SetContextFont (TinyFont); SetContextForeGroundColor (PICK_VALUE_COLOR); font_DrawText (&t); SetContext (OldContext); }
SIZE InitShips (void) { SIZE num_ships; InitSpace (); SetContext (StatusContext); SetContext (SpaceContext); InitDisplayList (); InitGalaxy (); if (inHQSpace ()) { ReinitQueue (&race_q[0]); ReinitQueue (&race_q[1]); BuildSIS (); LoadHyperspace (); num_ships = 1; } else { COUNT i; RECT r; SetContextFGFrame (Screen); r.corner.x = SAFE_X; r.corner.y = SAFE_Y; r.extent.width = SPACE_WIDTH; r.extent.height = SPACE_HEIGHT; SetContextClipRect (&r); SetContextBackGroundColor (BLACK_COLOR); { CONTEXT OldContext; OldContext = SetContext (ScreenContext); SetContextBackGroundColor (BLACK_COLOR); ClearDrawable (); SetContext (OldContext); } if (LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE) free_gravity_well (); else { #define NUM_ASTEROIDS 5 for (i = 0; i < NUM_ASTEROIDS; ++i) spawn_asteroid (NULL); #define NUM_PLANETS 1 for (i = 0; i < NUM_PLANETS; ++i) spawn_planet (); } num_ships = NUM_SIDES; } // FlushInput (); return (num_ships); }
// Show the contexts on the screen. // Must be called from the main thread. void debugContexts (void) { static volatile bool inDebugContexts = false; // Prevent this function from being called from within itself. CONTEXT orgContext; CONTEXT debugDrawContext; // We're going to use this context to draw in. FRAME debugDrawFrame; double hueIncrement; size_t visibleContextI; CONTEXT context; size_t contextCount; FRAME savedScreen; // Prevent this function from being called from within itself. if (inDebugContexts) return; inDebugContexts = true; contextCount = countVisibleContexts (); if (contextCount == 0) { goto out; } savedScreen = getScreen (); FlushGraphics (); // Make sure that the screen has actually been captured, // before we use the frame. // Create a new frame to draw on. debugDrawContext = CreateContext ("debugDrawContext"); // New work frame is a copy of the original. debugDrawFrame = CaptureDrawable (CloneFrame (savedScreen)); orgContext = SetContext (debugDrawContext); SetContextFGFrame (debugDrawFrame); hueIncrement = 360.0 / contextCount; visibleContextI = 0; for (context = GetFirstContext (); context != NULL; context = GetNextContext (context)) { if (context == debugDrawContext) { // Skip our own context. continue; } if (isContextVisible (context)) { // Only draw the visible contexts. drawContext (context, visibleContextI * hueIncrement); visibleContextI++; } describeContext (stderr, context); } // Blit the final debugging frame to the screen. putScreen (debugDrawFrame); // Wait for a key: { WAIT_STATE state; state.InputFunc = waitForKey; DoInput(&state, TRUE); } SetContext (orgContext); // Destroy the debugging frame and context. DestroyContext (debugDrawContext); // This does nothing with the drawable set with // SetContextFGFrame(). DestroyDrawable (ReleaseDrawable (debugDrawFrame)); putScreen (savedScreen); DestroyDrawable (ReleaseDrawable (savedScreen)); out: inDebugContexts = false; }
// Put the ship icons in the PickMeleeFrame, and create a queue // for each player. // XXX TODO: split off creating the queue into a separate function. void FillPickMeleeFrame (MeleeSetup *setup) { COUNT i; CONTEXT OldContext; OldContext = SetContext (OffScreenContext); for (i = 0; i < NUM_SIDES; ++i) { COUNT side; COUNT sideI; RECT r; TEXT t; STAMP s; UNICODE buf[30]; FleetShipIndex index; sideI = GetPlayerOrder (i); side = !sideI; s.frame = SetAbsFrameIndex (PickMeleeFrame, side); SetContextFGFrame (s.frame); GetFrameRect (s.frame, &r); t.baseline.x = r.extent.width >> 1; t.baseline.y = r.extent.height - NAME_AREA_HEIGHT + RES_SCALE(4); r.corner.x += RES_SCALE(2); r.corner.y += RES_SCALE(2); r.extent.width -= RES_SCALE((2 * 2) + (RES_DESCALE(ICON_WIDTH) + 2) + 1); // JMS_GFX r.extent.height -= RES_SCALE(2 * 2) + NAME_AREA_HEIGHT; // JMS_GFX SetContextForeGroundColor (PICK_BG_COLOR); DrawFilledRectangle (&r); r.corner.x += RES_SCALE(2); // JMS_GFX r.extent.width += RES_SCALE((RES_DESCALE(ICON_WIDTH) + 2) - (2 * 2)); // JMS_GFX r.corner.y += r.extent.height; r.extent.height = NAME_AREA_HEIGHT; DrawFilledRectangle (&r); // Team name at the bottom of the frame: t.align = ALIGN_CENTER; t.pStr = MeleeSetup_getTeamName (setup, sideI); t.CharCount = (COUNT) ~0; SetContextFont (TinyFont); SetContextForeGroundColor (PICKSHIP_TEAM_NAME_TEXT_COLOR); font_DrawText (&t); // Total team value of the starting team: sprintf (buf, "%u", MeleeSetup_getFleetValue (setup, sideI)); t.baseline.x = RES_SCALE(4); t.baseline.y = RES_SCALE(7); t.align = ALIGN_LEFT; t.pStr = buf; t.CharCount = (COUNT)~0; SetContextForeGroundColor (PICKSHIP_TEAM_START_VALUE_COLOR); font_DrawText (&t); assert (CountLinks (&race_q[side]) == 0); for (index = 0; index < MELEE_FLEET_SIZE; index++) { MeleeShip StarShip; StarShip = MeleeSetup_getShip (setup, sideI, index); if (StarShip == MELEE_NONE) continue; { BYTE row, col; BYTE ship_cost; HMASTERSHIP hMasterShip; HSTARSHIP hBuiltShip; MASTER_SHIP_INFO *MasterPtr; STARSHIP *BuiltShipPtr; BYTE captains_name_index; hMasterShip = GetStarShipFromIndex (&master_q, StarShip); MasterPtr = LockMasterShip (&master_q, hMasterShip); captains_name_index = NameCaptain (&race_q[side], MasterPtr->SpeciesID); hBuiltShip = Build (&race_q[side], MasterPtr->SpeciesID); // Draw the icon. row = PickMelee_GetShipRow (index); col = PickMelee_GetShipColumn (index); s.origin.x = RES_SCALE(4) + ((ICON_WIDTH + RES_SCALE(2)) * col); // JMS_GFX s.origin.y = RES_SCALE(10) + ((ICON_HEIGHT + RES_SCALE(2)) * row); s.frame = MasterPtr->ShipInfo.icons; DrawStamp (&s); ship_cost = MasterPtr->ShipInfo.ship_cost; UnlockMasterShip (&master_q, hMasterShip); BuiltShipPtr = LockStarShip (&race_q[side], hBuiltShip); BuiltShipPtr->index = index; BuiltShipPtr->ship_cost = ship_cost; BuiltShipPtr->playerNr = side; BuiltShipPtr->captains_name_index = captains_name_index; // The next ones are not used in Melee BuiltShipPtr->crew_level = 0; BuiltShipPtr->max_crew = 0; BuiltShipPtr->race_strings = 0; BuiltShipPtr->icons = 0; BuiltShipPtr->RaceDescPtr = 0; UnlockStarShip (&race_q[side], hBuiltShip); } } } SetContext (OldContext); }