static void flashSupportShip (ROSTER_STATE *rosterState) { static Color c = BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x00, 0x00), 0x24); static TimeCount NextTime = 0; if (GetTimeCounter () >= NextTime) { NextTime = GetTimeCounter () + (ONE_SECOND / 15); /* The commented code out code is the old code before the switch * to 24-bits colors. The current code produces very slightly * different colors due to rounding errors, but the old code wasn't * original anyhow, and you can't tell the difference visually. * - SvdB if (c >= BUILD_COLOR (MAKE_RGB15 (0x1F, 0x19, 0x19), 0x24)) c = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x00, 0x00), 0x24); else c += BUILD_COLOR (MAKE_RGB15 (0x00, 0x02, 0x02), 0x00); */ if (c.g >= CC5TO8 (0x19)) { c = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x00, 0x00), 0x24); } else { c.g += CC5TO8 (0x02); c.b += CC5TO8 (0x02); } SetContextForeGroundColor (c); drawSupportShip (rosterState, TRUE); } }
void ConfirmSaveLoad (STAMP *MsgStamp) { RECT r, clip_r; TEXT t; SetContextFont (StarConFont); GetContextClipRect (&clip_r); t.baseline.x = clip_r.extent.width >> 1; t.baseline.y = (clip_r.extent.height >> 1) + (3 << RESOLUTION_FACTOR); // JMS_GFX t.align = ALIGN_CENTER; t.CharCount = (COUNT)~0; if (MsgStamp) t.pStr = GAME_STRING (SAVEGAME_STRING_BASE + 0); // "Saving . . ." else t.pStr = GAME_STRING (SAVEGAME_STRING_BASE + 1); // "Loading . . ." TextRect (&t, &r, NULL); r.corner.x -= 4 << RESOLUTION_FACTOR; // JMS_GFX r.corner.y -= 4 << RESOLUTION_FACTOR; // JMS_GFX r.extent.width += 8 << RESOLUTION_FACTOR; // JMS_GFX r.extent.height += 8 << RESOLUTION_FACTOR; // JMS_GFX if (MsgStamp) { *MsgStamp = SaveContextFrame (&r); } if (RESOLUTION_FACTOR == 0) { DrawStarConBox (&r, 2, BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19), BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F), TRUE, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x14, 0x14, 0x14), 0x0F)); } else { DrawStarConBox (&r, 2, PCMENU_TOP_LEFT_BORDER_COLOR, PCMENU_BOTTOM_RIGHT_BORDER_COLOR, TRUE, PCMENU_BACKGROUND_COLOR); SetContextForeGroundColor (PCMENU_SELECTION_TEXT_COLOR); } font_DrawText (&t); }
void DrawBattleCrewAmount (SHIP_INFO *ShipInfoPtr, COORD y_offs) { #define MAX_CREW_DIGITS 3 RECT r; TEXT t; UNICODE buf[40]; t.baseline.x = BATTLE_CREW_X + 2; if (optWhichMenu == OPT_PC) t.baseline.x -= 8; t.baseline.y = BATTLE_CREW_Y + y_offs; t.align = ALIGN_LEFT; t.pStr = buf; t.CharCount = (COUNT)~0; r.corner.x = t.baseline.x; r.corner.y = t.baseline.y - 5; r.extent.width = 6 * MAX_CREW_DIGITS + 6; r.extent.height = 5; sprintf (buf, "%u", ShipInfoPtr->crew_level); SetContextFont (StarConFont); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); DrawFilledRectangle (&r); SetContextForeGroundColor (BLACK_COLOR); font_DrawText (&t); }
static COUNT initialize_autoaim_laser (ELEMENT *ShipPtr, HELEMENT LaserArray[]) { COUNT orig_facing; SIZE delta_facing; STARSHIP *StarShipPtr; LASER_BLOCK LaserBlock; GetElementStarShip (ShipPtr, &StarShipPtr); LaserBlock.face = orig_facing = StarShipPtr->ShipFacing; if ((delta_facing = TrackShip (ShipPtr, &LaserBlock.face)) > 0) LaserBlock.face = NORMALIZE_FACING (orig_facing + delta_facing); ShipPtr->hTarget = 0; LaserBlock.cx = ShipPtr->next.location.x; LaserBlock.cy = ShipPtr->next.location.y; LaserBlock.ex = COSINE (FACING_TO_ANGLE (LaserBlock.face), LASER_RANGE); LaserBlock.ey = SINE (FACING_TO_ANGLE (LaserBlock.face), LASER_RANGE); LaserBlock.sender = ShipPtr->playerNr; LaserBlock.flags = IGNORE_SIMILAR; LaserBlock.pixoffs = ARILOU_OFFSET; LaserBlock.color = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x0A), 0x0E); LaserArray[0] = initialize_laser (&LaserBlock); return (1); }
static void DoRunAway (STARSHIP *StarShipPtr) { ELEMENT *ElementPtr; LockElement (StarShipPtr->hShip, &ElementPtr); if (GetPrimType (&DisplayArray[ElementPtr->PrimIndex]) == STAMP_PRIM && ElementPtr->life_span == NORMAL_LIFE && !(ElementPtr->state_flags & FINITE_LIFE) && ElementPtr->mass_points != MAX_SHIP_MASS * 10 && !(ElementPtr->state_flags & APPEARING)) { battle_counter[0]--; ElementPtr->turn_wait = 3; ElementPtr->thrust_wait = 4; ElementPtr->colorCycleIndex = 0; ElementPtr->preprocess_func = flee_preprocess; ElementPtr->mass_points = MAX_SHIP_MASS * 10; ZeroVelocityComponents (&ElementPtr->velocity); StarShipPtr->cur_status_flags &= ~(SHIP_AT_MAX_SPEED | SHIP_BEYOND_MAX_SPEED); SetPrimColor (&DisplayArray[ElementPtr->PrimIndex], BUILD_COLOR (MAKE_RGB15 (0x0B, 0x00, 0x00), 0x2E)); // XXX: I think this is supposed to be the same as the // first entry of the color cycle table in flee_preeprocess, // but it is slightly different (0x0A as red value). - SvdB. SetPrimType (&DisplayArray[ElementPtr->PrimIndex], STAMPFILL_PRIM); StarShipPtr->ship_input_state = 0; } UnlockElement (StarShipPtr->hShip); }
void DrawBattleCrewAmount (SHIP_INFO *ShipInfoPtr, COORD y_offs) { #define MAX_CREW_DIGITS 3 RECT r; TEXT t; UNICODE buf[40]; t.baseline.x = BATTLE_CREW_X + RES_STAT_SCALE(2) - RES_CASE(0,0,2); // JMS_GFX if (optWhichMenu == OPT_PC) t.baseline.x -= RES_STAT_SCALE(8); // JMS_GFX t.baseline.y = BATTLE_CREW_Y + y_offs; t.align = ALIGN_LEFT; t.pStr = buf; t.CharCount = (COUNT)~0; r.corner.x = t.baseline.x; r.corner.y = t.baseline.y - (5 << RESOLUTION_FACTOR); // JMS_GFX r.extent.width = 6 * MAX_CREW_DIGITS + (6 << RESOLUTION_FACTOR) + RESOLUTION_FACTOR; // JMS_GFX r.extent.height = (5 << RESOLUTION_FACTOR) + RES_CASE(0,2,3); // JMS_GFX sprintf (buf, "%u", ShipInfoPtr->crew_level); SetContextFont (StarConFont); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); DrawFilledRectangle (&r); SetContextForeGroundColor (BLACK_COLOR); font_DrawText (&t); }
static BOOLEAN DrawNameString (bool nameCaptain, UNICODE *Str, COUNT CursorPos, COUNT state) { RECT r; TEXT lf; Color BackGround, ForeGround; FONT Font; LockMutex (GraphicsLock); { r.extent.width = SHIP_NAME_WIDTH; // JMS_GFX r.extent.height = SHIP_NAME_HEIGHT; SetContext (StatusContext); if (nameCaptain) { // Naming the captain Font = TinyFont; r.corner.x = RES_STAT_SCALE(3); // JMS_GFX; r.corner.y = RES_CASE(10,18,30); // JMS_GFX r.extent.width -= RES_STAT_SCALE(2); // JMS_GFX; lf.baseline.x = (STATUS_WIDTH >> 1) - RES_CASE(1,0,-1); lf.baseline.y = r.corner.y + r.extent.height - RES_CASE(1,4,3); BackGround = BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x1F), 0x09); ForeGround = BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x0B); } else { // Naming the flagship Font = StarConFont; r.corner.x = RES_CASE(2,4,7); // JMS_GFX; r.corner.y = RES_CASE(20,40,62); // JMS_GFX; lf.baseline.x = r.corner.x + (r.extent.width >> 1); lf.baseline.y = r.corner.y + r.extent.height - RES_CASE(1,3,3); // JMS_GFX BackGround = BUILD_COLOR (MAKE_RGB15 (0x0F, 0x00, 0x00), 0x2D); ForeGround = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0A, 0x00), 0x7D); } lf.align = ALIGN_CENTER; }
static int flash_ship_task (void *data) { DWORD TimeIn; COLOR c; Task task = (Task) data; c = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x00, 0x00), 0x24); TimeIn = GetTimeCounter (); while (!Task_ReadState (task, TASK_EXIT)) { STAMP s; SHIP_FRAGMENT *StarShipPtr; COLOR OldColor; CONTEXT OldContext; LockMutex (GraphicsLock); s.origin = pMenuState->first_item; StarShipPtr = LockShipFrag (&GLOBAL (built_ship_q), (HSHIPFRAG)pMenuState->CurFrame); s.frame = StarShipPtr->icons; UnlockShipFrag (&GLOBAL (built_ship_q), (HSHIPFRAG)pMenuState->CurFrame); OldContext = SetContext (StatusContext); if (c >= BUILD_COLOR (MAKE_RGB15 (0x1F, 0x19, 0x19), 0x24)) c = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x00, 0x00), 0x24); else c += BUILD_COLOR (MAKE_RGB15 (0x00, 0x02, 0x02), 0x00); OldColor = SetContextForeGroundColor (c); DrawFilledStamp (&s); SetContextForeGroundColor (OldColor); SetContext (OldContext); UnlockMutex (GraphicsLock); SleepThreadUntil (TimeIn + ONE_SECOND / 15); TimeIn = GetTimeCounter (); } FinishTask (task); return 0; }
/* * Draws the retreat_wait counter for a ship. * Based on DrawBattleCrewAmount. * * StarShipPtr: the starship crew is to be drawn for. */ static void draw_retreat_clock (STARSHIP *StarShipPtr) { #define MAX_TIMER_DIGITS 3 RECT r; TEXT t; COORD y_offs; UNICODE buf[40]; int time_left = ((StarShipPtr->entrance_time + opt_retreat_wait) - battleFrameCount); assert ((StarShipPtr->playerNr > -1) && (StarShipPtr->playerNr < 2)); y_offs = status_y_offsets[StarShipPtr->playerNr]; t.baseline.x = BATTLE_TIMER_XOFFS; t.baseline.y = BATTLE_TIMER_YOFFS + y_offs; t.align = ALIGN_LEFT; t.pStr = buf; t.CharCount = (COUNT)~0; r.corner.x = t.baseline.x; r.corner.y = t.baseline.y - 5; r.extent.width = 6 * MAX_TIMER_DIGITS + 6; r.extent.height = 5; /* if the ship can retreat, write 0 to the buffer */ sprintf (buf, "%d",(StarShipPtr->CanRunAway) ? 0 : ((time_left / 24) + 1)); SetContextFont (StarConFont); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); DrawFilledRectangle (&r); SetContextForeGroundColor (BLACK_COLOR); font_DrawText (&t); }
void DrawMenuStateStrings (BYTE beg_index, SWORD NewState) { BYTE end_index; RECT r; STAMP s; CONTEXT OldContext; BYTE hilite = 1; extern FRAME PlayFrame; if (NewState < 0) { NewState = -NewState; hilite = 0; } if (optWhichMenu == OPT_PC) { BYTE tmpState = (BYTE)NewState; GetAlternateMenu (&beg_index, &tmpState); NewState = tmpState; } if (beg_index == PM_STARMAP) NewState--; end_index = GetEndMenuState (beg_index); s.frame = 0; if (NewState <= end_index - beg_index) s.frame = SetAbsFrameIndex (PlayFrame, beg_index + NewState); PreUpdateFlashRect (); OldContext = SetContext (StatusContext); GetContextClipRect (&r); s.origin.x = RADAR_X - r.corner.x; s.origin.y = RADAR_Y - r.corner.y; r.corner.x = s.origin.x - 1; r.corner.y = s.origin.y - 11; r.extent.width = RADAR_WIDTH + 2; BatchGraphics (); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); if (s.frame && optWhichMenu == OPT_PC) { if (beg_index == PM_CREW) snprintf (pm_crew_str, sizeof pm_crew_str, "%s(%d)", GAME_STRING (MAINMENU_STRING_BASE + PM_CREW), GLOBAL (CrewCost)); if (beg_index == PM_FUEL) snprintf (pm_fuel_str, sizeof pm_fuel_str, "%s(%d)", GAME_STRING (MAINMENU_STRING_BASE + PM_FUEL), GLOBAL (FuelCost)); if (beg_index == PM_SOUND_ON) { end_index = beg_index + 5; switch (beg_index + NewState) { case PM_SOUND_ON: case PM_SOUND_OFF: NewState = 0; break; case PM_MUSIC_ON: case PM_MUSIC_OFF: NewState = 1; break; case PM_CYBORG_OFF: case PM_CYBORG_NORMAL: case PM_CYBORG_DOUBLE: case PM_CYBORG_SUPER: NewState = 2; break; case PM_CHANGE_CAPTAIN: NewState = 3; break; case PM_CHANGE_SHIP: NewState = 4; break; case PM_EXIT_SETTINGS: NewState = 5; break; } } r.extent.height = RADAR_HEIGHT + 11; DrawPCMenu (beg_index, end_index, (BYTE)NewState, hilite, &r); s.frame = 0; } else { if (optWhichMenu == OPT_PC) { r.corner.x -= 1; r.extent.width += 1; r.extent.height = RADAR_HEIGHT + 11; } else r.extent.height = 11; DrawFilledRectangle (&r); } if (s.frame) { DrawStamp (&s); switch (beg_index + NewState) { TEXT t; UNICODE buf[20]; case PM_CREW: t.baseline.x = s.origin.x + RADAR_WIDTH - 2; t.baseline.y = s.origin.y + RADAR_HEIGHT - 2; t.align = ALIGN_RIGHT; t.CharCount = (COUNT)~0; t.pStr = buf; snprintf (buf, sizeof buf, "%u", GLOBAL (CrewCost)); SetContextFont (TinyFont); SetContextForeGroundColor (THREEDOMENU_TEXT_COLOR); font_DrawText (&t); break; case PM_FUEL: t.baseline.x = s.origin.x + RADAR_WIDTH - 2; t.baseline.y = s.origin.y + RADAR_HEIGHT - 2; t.align = ALIGN_RIGHT; t.CharCount = (COUNT)~0; t.pStr = buf; snprintf (buf, sizeof buf, "%u", GLOBAL (FuelCost)); SetContextFont (TinyFont); SetContextForeGroundColor (THREEDOMENU_TEXT_COLOR); font_DrawText (&t); break; } } UnbatchGraphics (); SetContext (OldContext); PostUpdateFlashRect (); }
static void spawn_point_defense (PELEMENT ElementPtr) { STARSHIPPTR StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); if (ElementPtr->state_flags & PLAYER_SHIP) { HELEMENT hDefense; hDefense = AllocElement (); if (hDefense) { ELEMENTPTR DefensePtr; LockElement (hDefense, &DefensePtr); DefensePtr->state_flags = APPEARING | NONSOLID | FINITE_LIFE | (ElementPtr->state_flags & (GOOD_GUY | BAD_GUY)); { DefensePtr->death_func = spawn_point_defense; } GetElementStarShip (ElementPtr, &StarShipPtr); SetElementStarShip (DefensePtr, StarShipPtr); UnlockElement (hDefense); PutElement (hDefense); } } else { BOOLEAN PaidFor; HELEMENT hObject, hNextObject; ELEMENTPTR ShipPtr; PaidFor = FALSE; LockElement (StarShipPtr->hShip, &ShipPtr); for (hObject = GetTailElement (); hObject; hObject = hNextObject) { ELEMENTPTR ObjectPtr; LockElement (hObject, &ObjectPtr); hNextObject = GetPredElement (ObjectPtr); if (ObjectPtr != ShipPtr && CollidingElement (ObjectPtr) && !OBJECT_CLOAKED (ObjectPtr)) { #define LASER_RANGE (UWORD)100 SIZE delta_x, delta_y; delta_x = ObjectPtr->next.location.x - ShipPtr->next.location.x; delta_y = ObjectPtr->next.location.y - ShipPtr->next.location.y; if (delta_x < 0) delta_x = -delta_x; if (delta_y < 0) delta_y = -delta_y; delta_x = WORLD_TO_DISPLAY (delta_x); delta_y = WORLD_TO_DISPLAY (delta_y); if ((UWORD)delta_x <= LASER_RANGE && (UWORD)delta_y <= LASER_RANGE && (UWORD)delta_x * (UWORD)delta_x + (UWORD)delta_y * (UWORD)delta_y <= LASER_RANGE * LASER_RANGE) { HELEMENT hPointDefense; LASER_BLOCK LaserBlock; if (!PaidFor) { if (!DeltaEnergy (ShipPtr, -SPECIAL_ENERGY_COST)) break; ProcessSound (SetAbsSoundIndex ( /* POINT_DEFENSE_LASER */ StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 1)); StarShipPtr->special_counter = StarShipPtr->RaceDescPtr->characteristics.special_wait; PaidFor = TRUE; } LaserBlock.cx = ShipPtr->next.location.x; LaserBlock.cy = ShipPtr->next.location.y; LaserBlock.face = 0; LaserBlock.ex = ObjectPtr->next.location.x - ShipPtr->next.location.x; LaserBlock.ey = ObjectPtr->next.location.y - ShipPtr->next.location.y; LaserBlock.sender = (ShipPtr->state_flags & (GOOD_GUY | BAD_GUY)) | IGNORE_SIMILAR; LaserBlock.pixoffs = 0; LaserBlock.color = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F); hPointDefense = initialize_laser (&LaserBlock); if (hPointDefense) { ELEMENTPTR PDPtr; LockElement (hPointDefense, &PDPtr); SetElementStarShip (PDPtr, StarShipPtr); PDPtr->hTarget = 0; UnlockElement (hPointDefense); PutElement (hPointDefense); } } } UnlockElement (hObject); } UnlockElement (StarShipPtr->hShip); } }
void DrawSISFrame (void) { RECT r; SetContext (ScreenContext); BatchGraphics (); { // Middle grey rectangles around space window. SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); // r.corner.x = 0; r.corner.y = 0; r.extent.width = SIS_ORG_X + SIS_SCREEN_WIDTH + 1; r.extent.height = SIS_ORG_Y - 1; DrawFilledRectangle (&r); // Inside Left Border r.corner.x = 0; r.corner.y = 0; r.extent.width = SIS_ORG_X - 1; r.extent.height = SIS_ORG_Y + SIS_SCREEN_HEIGHT + 1; DrawFilledRectangle (&r); // Bottom left of the border r.corner.x = 0; r.corner.y = r.extent.height; r.extent.width = SIS_ORG_X + SIS_SCREEN_WIDTH + 1; r.extent.height = SCREEN_HEIGHT - SIS_ORG_Y + SIS_SCREEN_HEIGHT; DrawFilledRectangle (&r); // Top right inside border r.corner.x = SIS_ORG_X + SIS_SCREEN_WIDTH + 1; r.corner.y = 0; r.extent.width = SCREEN_WIDTH - r.corner.x; r.extent.height = SCREEN_HEIGHT; DrawFilledRectangle (&r); // Light and dark grey edges of the inner space window. r.corner.x = SIS_ORG_X - 1; r.corner.y = SIS_ORG_Y - 1; r.extent.width = SIS_SCREEN_WIDTH + 2; r.extent.height = SIS_SCREEN_HEIGHT + 2; DrawStarConBox (&r, 1, BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19), BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F), TRUE, BLACK_COLOR); // The big Blue box in the upper edge of screen containing the star system name. r.corner.y = 0; r.extent.height = SIS_ORG_Y; r.corner.x = SIS_ORG_X; r.extent.width = SIS_MESSAGE_BOX_WIDTH; DrawStarConBox (&r, 1, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x0E), 0x54), BUILD_COLOR (MAKE_RGB15 (0x00, 0x01, 0x1C), 0x4E), TRUE, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); // The smaller blue box. r.extent.width = SIS_TITLE_BOX_WIDTH; r.corner.x = SIS_ORG_X + SIS_SCREEN_WIDTH - SIS_TITLE_BOX_WIDTH; DrawStarConBox (&r, 1, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x0E), 0x54), BUILD_COLOR (MAKE_RGB15 (0x00, 0x01, 0x1C), 0x4E), TRUE, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); // Black border between menu area and space window area SetContextForeGroundColor (BLACK_COLOR); r.corner.x = SAFE_X + SPACE_WIDTH - 1; r.corner.y = 0; r.extent.width = 1; r.extent.height = SCREEN_HEIGHT; DrawFilledRectangle (&r); // Bottom corners of the SIS gauges r.corner.x = SAFE_X + SPACE_WIDTH; r.corner.y = SAFE_Y + RES_CASE(139, 282, 434); // JMS_GFX DrawPoint (&r.corner); r.corner.x = SCREEN_WIDTH - 1; // JMS_GFX DrawPoint (&r.corner); // Light grey border on the left side of big blue box. SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19)); r.corner.y = 1; r.extent.width = 1; r.extent.height = SAFE_Y + SIS_TITLE_HEIGHT; r.corner.x = SIS_ORG_X - 1; DrawFilledRectangle (&r); // The same for small blue box r.corner.x = SIS_ORG_X + SIS_SCREEN_WIDTH - SIS_TITLE_BOX_WIDTH - 1; DrawFilledRectangle (&r); // Light grey horizontal line at the bottom of the screen, space window side r.corner.x = 0; r.corner.y = SCREEN_HEIGHT - 1; r.extent.width = SAFE_X + SPACE_WIDTH - 1; r.extent.height = 1; DrawFilledRectangle (&r); // Light grey vertical line at the right side of space window r.corner.x = SAFE_X + SPACE_WIDTH - 2; r.corner.y = 0; r.extent.width = 1; r.extent.height = SCREEN_HEIGHT - 1; DrawFilledRectangle (&r); // Vertical line at the right side of the menu window, upper part r.corner.x = SCREEN_WIDTH - 1; r.corner.y = 0; r.extent.width = 1; r.extent.height = SAFE_Y + RES_CASE(139, 282, 434); // JMS_GFX DrawFilledRectangle (&r); // Horizontal line at the bottom of the screen, menu window side r.corner.x = SAFE_X + SPACE_WIDTH; r.corner.y = SCREEN_HEIGHT - 1; r.extent.width = SCREEN_WIDTH - r.corner.x; r.extent.height = 1; DrawFilledRectangle (&r); // Vertical line at the right side of the menu window, lower part r.corner.x = SCREEN_WIDTH - 1; r.corner.y = SAFE_Y + RES_CASE(140, 283, 435); r.extent.width = 1; r.extent.height = (SCREEN_HEIGHT - 1) - r.corner.y; DrawFilledRectangle (&r); // Dark grey border around blue boxes. SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F)); // Vertical line on the right side of the big blue box r.corner.y = 1; // There was a reason this was supposed to be "1": Serosis r.extent.width = 1; r.extent.height = SAFE_Y + SIS_MESSAGE_HEIGHT; r.corner.x = SIS_ORG_X + SIS_MESSAGE_BOX_WIDTH; DrawFilledRectangle (&r); // Vertical line on the right side of the small blue box r.corner.x = SIS_ORG_X + SIS_SCREEN_WIDTH; ++r.extent.height; DrawFilledRectangle (&r); // r.corner.y = 0; r.extent.width = (SAFE_X + SPACE_WIDTH - 2) - r.corner.x; r.extent.height = 1; DrawFilledRectangle (&r); // r.corner.x = 0; r.extent.width = SIS_ORG_X - r.corner.x; DrawFilledRectangle (&r); // Horizontal line between boxes r.corner.x = SIS_ORG_X + SIS_MESSAGE_BOX_WIDTH; r.extent.width = SIS_SPACER_BOX_WIDTH; DrawFilledRectangle (&r); // r.corner.x = 0; r.corner.y = 1; r.extent.width = 1; r.extent.height = (SCREEN_HEIGHT - 1) - r.corner.y; DrawFilledRectangle (&r); // Dark verticle line accent for the top left of the right panel r.corner.x = SAFE_X + SPACE_WIDTH; r.corner.y = 0; r.extent.width = 1; r.extent.height = SAFE_Y + RES_CASE(139, 282, 434); // JMS_GFX DrawFilledRectangle (&r); // Horizontal line of the separator below the SIS gauges r.corner.x = SAFE_X + SPACE_WIDTH + 1; r.corner.y = SAFE_Y + RES_CASE(139, 282, 434); // JMS_GFX r.extent.width = STATUS_WIDTH - 2; r.extent.height = 1; DrawFilledRectangle (&r); // Dark verticle line accent for the bottom left of the right panel r.corner.x = SAFE_X + SPACE_WIDTH; r.corner.y = SAFE_Y + RES_CASE(140, 283, 435); // JMS_GFX r.extent.width = 1; r.extent.height = SCREEN_HEIGHT - r.corner.y; DrawFilledRectangle (&r); DrawBorder(0); } InitSISContexts (); ClearSISRect (DRAW_SIS_DISPLAY); UnbatchGraphics (); }
// status == -1: draw highlighted player dialog option // status == -2: draw non-highlighted player dialog option // status == -4: use current context, and baseline from pTextIn // status == 1: draw alien speech; subtitle cache is used static COORD add_text (int status, TEXT *pTextIn) { COUNT maxchars, numchars; TEXT locText; TEXT *pText; SIZE leading; const char *pStr; SIZE text_width; int num_lines = 0; static COORD last_baseline; BOOLEAN eol; CONTEXT OldContext = NULL; COUNT computerOn = 0; BatchGraphics (); maxchars = (COUNT)~0; if (status == 1) { if (last_subtitle == pTextIn->pStr) { // draws cached subtitle STAMP s; s.origin.x = 0; s.origin.y = 0; s.frame = TextCacheFrame; DrawStamp (&s); UnbatchGraphics (); return last_baseline; } else { // draw to subtitle cache; prepare first OldContext = SetContext (TextCacheContext); ClearDrawable (); last_subtitle = pTextIn->pStr; } text_width = CommData.AlienTextWidth; SetContextFont (CommData.AlienFont); GetContextFontLeading (&leading); pText = pTextIn; } else if (GetContextFontLeading (&leading), status <= -4) { text_width = (SIZE) (SIS_SCREEN_WIDTH - RES_SCALE(8) - (TEXT_X_OFFS << 2)); // JMS_GFX pText = pTextIn; } else { text_width = (SIZE) (SIS_SCREEN_WIDTH - RES_SCALE(8) - (TEXT_X_OFFS << 2)); // JMS_GFX switch (status) { case -3: // Unknown. Never reached; color matches the background color. SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); break; case -2: // Not highlighted dialog options. SetContextForeGroundColor (COMM_PLAYER_TEXT_NORMAL_COLOR); break; case -1: // Currently highlighted dialog option. SetContextForeGroundColor (COMM_PLAYER_TEXT_HIGHLIGHT_COLOR); break; } maxchars = pTextIn->CharCount; locText = *pTextIn; locText.baseline.x -= RES_SCALE(8) - 4 * RESOLUTION_FACTOR; // JMS_GFX locText.CharCount = (COUNT)~0; locText.pStr = STR_BULLET; font_DrawText (&locText); locText = *pTextIn; pText = &locText; pText->baseline.y -= leading; } numchars = 0; pStr = pText->pStr; if (status > 0 && (CommData.AlienTextValign & (VALIGN_MIDDLE | VALIGN_BOTTOM))) { num_lines = _count_lines(pText); if (CommData.AlienTextValign == VALIGN_BOTTOM) pText->baseline.y -= (leading * num_lines); else if (CommData.AlienTextValign == VALIGN_MIDDLE) pText->baseline.y -= ((leading * num_lines) / 2); if (pText->baseline.y < 0) pText->baseline.y = 0; } do { pText->pStr = pStr; pText->baseline.y += leading; eol = getLineWithinWidth (pText, &pStr, text_width, maxchars); maxchars -= pText->CharCount; if (maxchars != 0) --maxchars; numchars += pText->CharCount; if (status <= 0) { // Player dialog option or (status == -4) other non-alien // text. if (pText->baseline.y < SIS_SCREEN_HEIGHT) font_DrawText (pText); if (status < -4 && pText->baseline.y >= -status - 10) { // Never actually reached. Status is never <-4. ++pStr; break; } } else { // Alien speech if (CommData.AlienConv == ORZ_CONVERSATION) { // BW : special case for the Orz conversations // the character $ is recycled as a marker to // switch from and to computer font const char *ptr; RECT rect; COORD baselinex = pText->baseline.x; COORD width = 0; COUNT remChars = pText->CharCount; // Remaining chars until end of line within width const char *bakptr; COUNT bakChars = remChars; COUNT bakcompOn = computerOn; FONT bakFont = SetContextFont(ComputerFont); SetContextFont(bakFont); ptr = pText->pStr; bakptr = ptr; // We need to manually center the line because // the computer font is larger than the Orzfont // This loop computes the width of the line while (remChars > 0) { while ((*ptr != '$') && remChars > 0) { getCharFromString (&ptr); remChars--; } pText->CharCount -= remChars; TextRect (pText, &rect, NULL); width += rect.extent.width; if (*ptr == '$') { getCharFromString (&ptr); remChars--; computerOn = 1 - computerOn; if (computerOn) SetContextFont (ComputerFont); else SetContextFont (CommData.AlienFont); } pText->CharCount = remChars; pText->pStr = ptr; } // This to simulate a centered line pText->baseline.x = baselinex - (width >> 1); pText->align = ALIGN_LEFT; // Put everything back in place for the // actual display remChars = bakChars; pText->CharCount = bakChars; ptr = bakptr; pText->pStr = bakptr; computerOn = bakcompOn; SetContextFont(bakFont); // This loop is used to look up for $ while (remChars > 0) { while ((*ptr != '$') && remChars > 0) { getCharFromString (&ptr); remChars--; } pText->CharCount -= remChars; TextRect (pText, &rect, NULL); font_DrawTracedText (pText, CommData.AlienTextFColor, CommData.AlienTextBColor); pText->baseline.x += rect.extent.width; if (*ptr == '$') { getCharFromString (&ptr); remChars--; computerOn = 1 - computerOn; if (computerOn) SetContextFont (ComputerFont); else SetContextFont (CommData.AlienFont); } pText->CharCount = remChars; pText->pStr = ptr; } pText->baseline.x = baselinex; pText->align = ALIGN_CENTER; } else { // Normal case : other races than Orz font_DrawTracedText (pText, CommData.AlienTextFColor, CommData.AlienTextBColor); } } } while (!eol && maxchars); pText->pStr = pStr; if (status == 1) { STAMP s; // We were drawing to cache -- flush to screen SetContext (OldContext); s.origin.x = s.origin.y = 0; s.frame = TextCacheFrame; DrawStamp (&s); last_baseline = pText->baseline.y; } UnbatchGraphics (); return (pText->baseline.y); }
static void DrawDevices (PMENU_STATE pMS, BYTE OldDevice, BYTE NewDevice) { #define MAX_VIS_DEVICES 5 COORD y, cy; TEXT t; RECT r; PBYTE pDeviceMap; LockMutex (GraphicsLock); SetContext (StatusContext); SetContextFont (TinyFont); y = 41; t.baseline.x = 40; t.align = ALIGN_CENTER; t.CharCount = 3; pDeviceMap = (PBYTE)pMS->CurFrame; if (OldDevice > NUM_DEVICES || (NewDevice < NUM_DEVICES && (NewDevice < (BYTE)pMS->first_item.y || NewDevice >= (BYTE)(pMS->first_item.y + MAX_VIS_DEVICES)))) { STAMP s; r.corner.x = 2; r.extent.width = FIELD_WIDTH + 1; if (!(pMS->Initialized & 1)) { ++r.corner.x; r.extent.width -= 2; r.corner.y = 33; r.extent.height = 89; SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); DrawFilledRectangle (&r); } else { TEXT ct; r.corner.y = 20; r.extent.height = 109; DrawStarConBox (&r, 1, BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19), BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F), TRUE, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); SetContextFont (StarConFont); ct.baseline.x = (STATUS_WIDTH >> 1) - 1; ct.baseline.y = 27; ct.align = ALIGN_CENTER; ct.pStr = GAME_STRING (DEVICE_STRING_BASE); ct.CharCount = (COUNT)~0; SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x0B)); font_DrawText (&ct); SetContextFont (TinyFont); } if (NewDevice < (BYTE)pMS->first_item.y) pMS->first_item.y = NewDevice; else if (NewDevice >= (BYTE)(pMS->first_item.y + MAX_VIS_DEVICES)) pMS->first_item.y = NewDevice - (MAX_VIS_DEVICES - 1); s.origin.x = 4; s.origin.y = 34; cy = y; SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x14), 0x03)); for (OldDevice = (BYTE)pMS->first_item.y; OldDevice < (BYTE)(pMS->first_item.y + MAX_VIS_DEVICES) && OldDevice < (BYTE)pMS->first_item.x; ++OldDevice) { s.frame = SetAbsFrameIndex ( MiscDataFrame, 77 + pDeviceMap[OldDevice]); DrawStamp (&s); if (OldDevice != NewDevice) { t.baseline.y = cy; t.pStr = GAME_STRING (pDeviceMap[OldDevice] + DEVICE_STRING_BASE + 1); t.CharCount = utf8StringPos (t.pStr, ' '); font_DrawText (&t); t.baseline.y += 7; t.pStr = skipUTF8Chars (t.pStr, t.CharCount + 1); t.CharCount = (COUNT)~0; font_DrawText (&t); } cy += 18; s.origin.y += 18; } OldDevice = NewDevice; }
static void DrawRaceStrings (MENU_STATE *pMS, BYTE NewRaceItem) { RECT r; STAMP s; CONTEXT OldContext; OldContext = SetContext (StatusContext); GetContextClipRect (&r); s.origin.x = RADAR_X - r.corner.x; s.origin.y = RADAR_Y - r.corner.y; r.corner.x = s.origin.x - 1; r.corner.y = s.origin.y - 11; r.extent.width = RADAR_WIDTH + 2; r.extent.height = 11; BatchGraphics (); ClearSISRect (CLEAR_SIS_RADAR); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); DrawFilledRectangle (&r); r.corner = s.origin; r.extent.width = RADAR_WIDTH; r.extent.height = RADAR_HEIGHT; SetContextForeGroundColor (BLACK_COLOR); DrawFilledRectangle (&r); if (NewRaceItem != (BYTE)~0) { TEXT t; HFLEETINFO hStarShip; FLEET_INFO *FleetPtr; UNICODE buf[30]; hStarShip = GetAvailableRaceFromIndex (NewRaceItem); NewRaceItem = GetIndexFromStarShip (&GLOBAL (avail_race_q), hStarShip); // Draw the ship name, above the ship image. s.frame = SetAbsFrameIndex (pMS->ModuleFrame, 3 + NewRaceItem); DrawStamp (&s); // Draw the ship image. FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hStarShip); s.frame = FleetPtr->melee_icon; UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip); t.baseline.x = s.origin.x + RADAR_WIDTH - 2; t.baseline.y = s.origin.y + RADAR_HEIGHT - 2; s.origin.x += (RADAR_WIDTH >> 1); s.origin.y += (RADAR_HEIGHT >> 1); DrawStamp (&s); // Print the ship cost. t.align = ALIGN_RIGHT; t.CharCount = (COUNT)~0; t.pStr = buf; sprintf (buf, "%u", ShipCost[NewRaceItem]); SetContextFont (TinyFont); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x1F, 0x00), 0x02)); font_DrawText (&t); }
static void destruct_preprocess (PELEMENT ElementPtr) { #define DESTRUCT_SWITCH ((NUM_EXPLOSION_FRAMES * 3) - 3) PPRIMITIVE lpPrim; lpPrim = &(GLOBAL (DisplayArray))[ElementPtr->PrimIndex]; ElementPtr->state_flags |= CHANGING; if (ElementPtr->life_span > DESTRUCT_SWITCH) { SetPrimType (lpPrim, STAMPFILL_PRIM); if (ElementPtr->life_span == DESTRUCT_SWITCH + 2) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x0A), 0x0E)); else SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)); } else if (ElementPtr->life_span < DESTRUCT_SWITCH) { ElementPtr->next.image.frame = IncFrameIndex (ElementPtr->current.image.frame); if (GetPrimColor (lpPrim) == BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x0A), 0x0E)); else if (GetPrimColor (lpPrim) == BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x0A), 0x0E)) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0A, 0x0A), 0x0C)); else if (GetPrimColor (lpPrim) == BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0A, 0x0A), 0x0C)) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x14, 0x0A, 0x00), 0x06)); else if (GetPrimColor (lpPrim) == BUILD_COLOR (MAKE_RGB15 (0x14, 0x0A, 0x00), 0x06)) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x14, 0x00, 0x00), 0x04)); } else { HELEMENT hDestruct; SetPrimType (lpPrim, NO_PRIM); ElementPtr->preprocess_func = NULL_PTR; hDestruct = AllocElement (); if (hDestruct) { ELEMENTPTR DestructPtr; STARSHIPPTR StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); PutElement (hDestruct); LockElement (hDestruct, &DestructPtr); SetElementStarShip (DestructPtr, StarShipPtr); DestructPtr->hit_points = DestructPtr->mass_points = 0; DestructPtr->state_flags = APPEARING | FINITE_LIFE | NONSOLID; DestructPtr->life_span = (NUM_EXPLOSION_FRAMES - 3) - 1; SetPrimType ( &(GLOBAL (DisplayArray))[DestructPtr->PrimIndex], STAMPFILL_PRIM ); SetPrimColor ( &(GLOBAL (DisplayArray))[DestructPtr->PrimIndex], BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F) ); DestructPtr->current.image.farray = StarShipPtr->RaceDescPtr->ship_data.special; DestructPtr->current.image.frame = StarShipPtr->RaceDescPtr->ship_data.special[0]; DestructPtr->current.location = ElementPtr->current.location; { DestructPtr->preprocess_func = destruct_preprocess; } DestructPtr->postprocess_func = DestructPtr->death_func = NULL_PTR; ZeroVelocityComponents (&DestructPtr->velocity); UnlockElement (hDestruct); } } }
/* Some basic color defines */ #define WIDGET_ACTIVE_COLOR \ BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x00), 0x0E) #define WIDGET_INACTIVE_COLOR \ BUILD_COLOR (MAKE_RGB15 (0x18, 0x18, 0x1F), 0x00) #define WIDGET_INACTIVE_SELECTED_COLOR \ BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F) #define WIDGET_CURSOR_COLOR \ BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x00), 0x00) #define WIDGET_DIALOG_COLOR \ BUILD_COLOR (MAKE_RGB15 (0x14, 0x14, 0x14), 0x07) #define WIDGET_DIALOG_TEXT_COLOR \ BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x00), 0x00) static Color win_bg_clr = BUILD_COLOR (MAKE_RGB15_INIT (0x18, 0x18, 0x1F), 0x00); static Color win_medium_clr = BUILD_COLOR (MAKE_RGB15_INIT (0x10, 0x10, 0x18), 0x00); static Color win_dark_clr = BUILD_COLOR (MAKE_RGB15_INIT (0x08, 0x08, 0x10), 0x00); static FONT cur_font; void DrawShadowedBox (RECT *r, Color bg, Color dark, Color medium) { RECT t; Color oldcolor; BatchGraphics ();
// Called from the death_func of an element for an ion trail pixel, or a // ship shadow (when warping in/out). static void cycle_ion_trail (ELEMENT *ElementPtr) { STARSHIP *StarShipPtr; SHIP_INFO *ShipInfoPtr; // Color table for fully functional thrusters static const Color colorTab[] = { BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x15, 0x00), 0x7a), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x11, 0x00), 0x7b), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x0E, 0x00), 0x7c), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x0A, 0x00), 0x7d), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x07, 0x00), 0x7e), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x03, 0x00), 0x7f), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x00, 0x00), 0x2a), BUILD_COLOR (MAKE_RGB15_INIT (0x1B, 0x00, 0x00), 0x2b), BUILD_COLOR (MAKE_RGB15_INIT (0x17, 0x00, 0x00), 0x2c), BUILD_COLOR (MAKE_RGB15_INIT (0x13, 0x00, 0x00), 0x2d), BUILD_COLOR (MAKE_RGB15_INIT (0x0F, 0x00, 0x00), 0x2e), BUILD_COLOR (MAKE_RGB15_INIT (0x0B, 0x00, 0x00), 0x2f), }; // JMS: Color table for damaged thrusters static const Color colorTab2[] = { BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x15, 0x1F), 0x7a), BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x11, 0x1F), 0x7b), BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x0E, 0x1F), 0x7c), BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x0A, 0x1F), 0x7d), BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x07, 0x1F), 0x7e), BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x03, 0x1F), 0x7f), BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x1F), 0x2a), BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x1B), 0x2b), BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x17), 0x2c), BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x13), 0x2d), BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x0F), 0x2e), BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x0B), 0x2f), }; const size_t colorTabCount = sizeof colorTab / sizeof colorTab[0]; // JMS: Get the pointers to element's owner ship. // They are needed to see if the ship's thrust is damaged GetElementStarShip (ElementPtr, &StarShipPtr); ShipInfoPtr = &StarShipPtr->RaceDescPtr->ship_info; assert (!(ElementPtr->state_flags & PLAYER_SHIP)); ElementPtr->colorCycleIndex++; if (ElementPtr->colorCycleIndex != colorTabCount) { ElementPtr->life_span = ElementPtr->thrust_wait; // Reset the life span. // JMS: Damaged thruster emits differently colored particles if (ShipInfoPtr->damage_flags & DAMAGE_THRUST) { SetPrimColor (&DisplayArray[ElementPtr->PrimIndex], colorTab2[ElementPtr->colorCycleIndex]); } else { SetPrimColor (&DisplayArray[ElementPtr->PrimIndex], colorTab[ElementPtr->colorCycleIndex]); } ElementPtr->state_flags &= ~DISAPPEARING; ElementPtr->state_flags |= CHANGING; } // else, the element disappears. }
static void ilwrath_preprocess (PELEMENT ElementPtr) { ELEMENT_FLAGS status_flags; STARSHIPPTR StarShipPtr; PPRIMITIVE lpPrim; GetElementStarShip (ElementPtr, &StarShipPtr); status_flags = StarShipPtr->cur_status_flags; lpPrim = &(GLOBAL (DisplayArray))[ElementPtr->PrimIndex]; if (GetPrimType (lpPrim) == STAMPFILL_PRIM) { COLOR Color; BOOLEAN weapon_discharge; Color = GetPrimColor (lpPrim); weapon_discharge = ((status_flags & WEAPON) && StarShipPtr->RaceDescPtr->ship_info.energy_level >= WEAPON_ENERGY_COST); if (weapon_discharge || (StarShipPtr->special_counter == 0 && ((status_flags & SPECIAL) || Color != BLACK_COLOR))) { if (Color == BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)) SetPrimType (lpPrim, STAMP_PRIM); else if (Color == BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x0B)) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)); else if (Color == BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x14), 0x03)) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x0B)); else if (Color == BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x1F), 0x09)) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x14), 0x03)); else if (Color == BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x1F), 0x09)); else { ProcessSound (SetAbsSoundIndex ( /* CLOAKING_OFF */ StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 2), ElementPtr); SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); if (weapon_discharge) { COUNT facing; facing = StarShipPtr->ShipFacing; if (TrackShip (ElementPtr, &facing) >= 0) { #define LOOK_AHEAD 4 ELEMENTPTR eptr; SIZE dx0, dy0, dx1, dy1; VELOCITY_DESC v; LockElement (ElementPtr->hTarget, &eptr); v = eptr->velocity; GetNextVelocityComponents (&v, &dx0, &dy0, LOOK_AHEAD); v = ElementPtr->velocity; GetNextVelocityComponents (&v, &dx1, &dy1, LOOK_AHEAD); dx0 = (eptr->current.location.x + dx0) - (ElementPtr->current.location.x + dx1); dy0 = (eptr->current.location.y + dy0) - (ElementPtr->current.location.y + dy1); UnlockElement (ElementPtr->hTarget); StarShipPtr->ShipFacing = NORMALIZE_FACING ( ANGLE_TO_FACING (ARCTAN (dx0, dy0)) ); #ifdef NOTYET if (ElementPtr->thrust_wait == 0 && (StarShipPtr->cur_status_flags & THRUST)) { COUNT last_facing; do { VELOCITY_DESC temp_v; last_facing = StarShipPtr->ShipFacing; inertial_thrust (ElementPtr); temp_v = ElementPtr->velocity; ElementPtr->velocity = v; dx0 += dx1; dy0 += dy1; GetNextVelocityComponents (&temp_v, &dx1, &dy1, LOOK_AHEAD); dx0 -= dx1; dy0 -= dy1; StarShipPtr->ShipFacing = NORMALIZE_FACING ( ANGLE_TO_FACING (ARCTAN (dx0, dy0)) ); } while (StarShipPtr->ShipFacing != last_facing); } #endif /* NOTYET */ if (ElementPtr->turn_wait == 0) ++ElementPtr->turn_wait; ElementPtr->next.image.frame = SetAbsFrameIndex (ElementPtr->next.image.frame, StarShipPtr->ShipFacing); } ElementPtr->hTarget = 0; } } ElementPtr->state_flags |= CHANGING; status_flags &= ~SPECIAL; StarShipPtr->special_counter = 0; } else if (Color != BLACK_COLOR) { if (Color == BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)) { SetPrimColor (lpPrim, BLACK_COLOR); Untarget (ElementPtr); } else if (Color == BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x1F), 0x09)) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); else if (Color == BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x14), 0x03)) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x1F), 0x09)); else if (Color == BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x0B)) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x14), 0x03)); else SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x0B)); ElementPtr->state_flags |= CHANGING; } } if ((status_flags & SPECIAL) && StarShipPtr->special_counter == 0 && DeltaEnergy (ElementPtr, -SPECIAL_ENERGY_COST)) { SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)); SetPrimType (lpPrim, STAMPFILL_PRIM); ProcessSound (SetAbsSoundIndex ( /* CLOAKING_ON */ StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 1), ElementPtr); StarShipPtr->special_counter = StarShipPtr->RaceDescPtr->characteristics.special_wait; ElementPtr->state_flags |= CHANGING; } }
static BOOLEAN RestartMenu (PMENU_STATE pMS) { DWORD TimeOut; BYTE black_buf[1]; ReinitQueue (&race_q[0]); ReinitQueue (&race_q[1]); black_buf[0] = FadeAllToBlack; SetContext (ScreenContext); GLOBAL (CurrentActivity) |= CHECK_ABORT; if (GLOBAL_SIS (CrewEnlisted) == (COUNT)~0 && GET_GAME_STATE (UTWIG_BOMB_ON_SHIP) && !GET_GAME_STATE (UTWIG_BOMB)) { // player blew himself up with Utwig bomb BYTE white_buf[] = {FadeAllToWhite}; SET_GAME_STATE (UTWIG_BOMB_ON_SHIP, 0); SleepThreadUntil (XFormColorMap ((COLORMAPPTR)white_buf, ONE_SECOND / 8) + ONE_SECOND / 60); SetContextBackGroundColor (BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)); ClearDrawable (); FlushColorXForms (); TimeOut = ONE_SECOND / 8; } else { TimeOut = ONE_SECOND / 2; if (LOBYTE (LastActivity) == WON_LAST_BATTLE) { GLOBAL (CurrentActivity) = WON_LAST_BATTLE; Victory (); Credits (TRUE); FreeGameData (); TimeOut = ONE_SECOND / 2; GLOBAL (CurrentActivity) = CHECK_ABORT; } } LastActivity = NextActivity = 0; SleepThreadUntil (XFormColorMap ((COLORMAPPTR)black_buf, TimeOut)); if (TimeOut == ONE_SECOND / 8) SleepThread (ONE_SECOND * 3); DrawRestartMenuGraphic (pMS); FlushInput (); GLOBAL (CurrentActivity) &= ~CHECK_ABORT; SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); DoInput (pMS, TRUE); StopMusic (); if (pMS->hMusic) { DestroyMusic (pMS->hMusic); pMS->hMusic = 0; } LockMutex (GraphicsLock); SetFlashRect (NULL_PTR, (FRAME)0); UnlockMutex (GraphicsLock); DestroyDrawable (ReleaseDrawable (pMS->CurFrame)); if (GLOBAL (CurrentActivity) == (ACTIVITY)~0) return (FALSE); // timed out if (GLOBAL (CurrentActivity) & CHECK_ABORT) return (FALSE); // quit TimeOut = XFormColorMap ((COLORMAPPTR)black_buf, ONE_SECOND / 2); SleepThreadUntil (TimeOut); FlushColorXForms (); SeedRandomNumbers (); return (LOBYTE (GLOBAL (CurrentActivity)) != SUPER_MELEE); }
// status == -1: draw highlighted player dialog option // status == -2: draw non-highlighted player dialog option // status == -4: use current context, and baseline from pTextIn // status == 1: draw alien speech; subtitle cache is used static COORD add_text (int status, TEXT *pTextIn) { COUNT maxchars, numchars; TEXT locText; TEXT *pText; SIZE leading; const char *pStr; SIZE text_width; int num_lines = 0; static COORD last_baseline; BOOLEAN eol; CONTEXT OldContext = NULL; BatchGraphics (); maxchars = (COUNT)~0; if (status == 1) { if (last_subtitle == pTextIn->pStr) { // draws cached subtitle STAMP s; s.origin.x = 0; s.origin.y = 0; s.frame = TextCacheFrame; DrawStamp (&s); UnbatchGraphics (); return last_baseline; } else { // draw to subtitle cache; prepare first OldContext = SetContext (TextCacheContext); ClearDrawable (); last_subtitle = pTextIn->pStr; } text_width = CommData.AlienTextWidth; SetContextFont (CommData.AlienFont); GetContextFontLeading (&leading); pText = pTextIn; } else if (GetContextFontLeading (&leading), status <= -4) { text_width = (SIZE) (SIS_SCREEN_WIDTH - 8 - (TEXT_X_OFFS << 2)); pText = pTextIn; } else { text_width = (SIZE) (SIS_SCREEN_WIDTH - 8 - (TEXT_X_OFFS << 2)); switch (status) { case -3: // Unknown. Never reached; color matches the background color. SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); break; case -2: // Not highlighted dialog options. SetContextForeGroundColor (COMM_PLAYER_TEXT_NORMAL_COLOR); break; case -1: // Currently highlighted dialog option. SetContextForeGroundColor (COMM_PLAYER_TEXT_HIGHLIGHT_COLOR); break; } maxchars = pTextIn->CharCount; locText = *pTextIn; locText.baseline.x -= 8; locText.CharCount = (COUNT)~0; locText.pStr = STR_BULLET; font_DrawText (&locText); locText = *pTextIn; pText = &locText; pText->baseline.y -= leading; } numchars = 0; pStr = pText->pStr; if (status > 0 && (CommData.AlienTextValign & (VALIGN_MIDDLE | VALIGN_BOTTOM))) { num_lines = _count_lines(pText); if (CommData.AlienTextValign == VALIGN_BOTTOM) pText->baseline.y -= (leading * num_lines); else if (CommData.AlienTextValign == VALIGN_MIDDLE) pText->baseline.y -= ((leading * num_lines) / 2); if (pText->baseline.y < 0) pText->baseline.y = 0; } do { pText->pStr = pStr; pText->baseline.y += leading; eol = getLineWithinWidth (pText, &pStr, text_width, maxchars); maxchars -= pText->CharCount; if (maxchars != 0) --maxchars; numchars += pText->CharCount; if (status <= 0) { // Player dialog option or (status == -4) other non-alien // text. if (pText->baseline.y < SIS_SCREEN_HEIGHT) font_DrawText (pText); if (status < -4 && pText->baseline.y >= -status - 10) { // Never actually reached. Status is never <-4. ++pStr; break; } } else { // Alien speech font_DrawTracedText (pText, CommData.AlienTextFColor, CommData.AlienTextBColor); } } while (!eol && maxchars); pText->pStr = pStr; if (status == 1) { STAMP s; // We were drawing to cache -- flush to screen SetContext (OldContext); s.origin.x = s.origin.y = 0; s.frame = TextCacheFrame; DrawStamp (&s); last_baseline = pText->baseline.y; } UnbatchGraphics (); return (pText->baseline.y); }
void flee_preprocess (ELEMENT *ElementPtr) { STARSHIP *StarShipPtr; if (--ElementPtr->turn_wait == 0) { static const Color colorTab[] = { BUILD_COLOR (MAKE_RGB15_INIT (0x0A, 0x00, 0x00), 0x2E), BUILD_COLOR (MAKE_RGB15_INIT (0x0E, 0x00, 0x00), 0x2D), BUILD_COLOR (MAKE_RGB15_INIT (0x13, 0x00, 0x00), 0x2C), BUILD_COLOR (MAKE_RGB15_INIT (0x17, 0x00, 0x00), 0x2B), BUILD_COLOR (MAKE_RGB15_INIT (0x1B, 0x00, 0x00), 0x2A), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x00, 0x00), 0x29), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x04, 0x04), 0x28), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x0A, 0x0A), 0x27), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x0F, 0x0F), 0x26), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x13, 0x13), 0x25), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x19, 0x19), 0x24), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x13, 0x13), 0x25), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x0F, 0x0F), 0x26), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x0A, 0x0A), 0x27), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x04, 0x04), 0x28), BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x00, 0x00), 0x29), BUILD_COLOR (MAKE_RGB15_INIT (0x1B, 0x00, 0x00), 0x2A), BUILD_COLOR (MAKE_RGB15_INIT (0x17, 0x00, 0x00), 0x2B), BUILD_COLOR (MAKE_RGB15_INIT (0x13, 0x00, 0x00), 0x2C), BUILD_COLOR (MAKE_RGB15_INIT (0x0E, 0x00, 0x00), 0x2D), }; const size_t colorTabCount = sizeof colorTab / sizeof colorTab[0]; ElementPtr->colorCycleIndex++; if (ElementPtr->colorCycleIndex == colorTabCount) ElementPtr->colorCycleIndex = 0; SetPrimColor (&DisplayArray[ElementPtr->PrimIndex], colorTab[ElementPtr->colorCycleIndex]); if (ElementPtr->colorCycleIndex == 0) --ElementPtr->thrust_wait; ElementPtr->turn_wait = ElementPtr->thrust_wait; if (ElementPtr->turn_wait) { ElementPtr->turn_wait = ((ElementPtr->turn_wait - 1) >> 1) + 1; } else if (ElementPtr->colorCycleIndex != (colorTabCount / 2))
void DrawSISFrame (void) { RECT r; SetContext (ScreenContext); BatchGraphics (); { SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); r.corner.x = 0; r.corner.y = 0; r.extent.width = SIS_ORG_X + SIS_SCREEN_WIDTH + 1; r.extent.height = SIS_ORG_Y - 1; DrawFilledRectangle (&r); r.corner.x = 0; r.corner.y = 0; r.extent.width = SIS_ORG_X - 1; r.extent.height = SIS_ORG_Y + SIS_SCREEN_HEIGHT + 1; DrawFilledRectangle (&r); r.corner.x = 0; r.corner.y = r.extent.height; r.extent.width = SIS_ORG_X + SIS_SCREEN_WIDTH + 1; r.extent.height = SCREEN_HEIGHT - SIS_ORG_Y + SIS_SCREEN_HEIGHT; DrawFilledRectangle (&r); r.corner.x = SIS_ORG_X + SIS_SCREEN_WIDTH + 1; r.corner.y = 0; r.extent.width = SCREEN_WIDTH - r.corner.x; r.extent.height = SCREEN_HEIGHT; DrawFilledRectangle (&r); r.corner.x = SIS_ORG_X - 1; r.corner.y = SIS_ORG_Y - 1; r.extent.width = SIS_SCREEN_WIDTH + 2; r.extent.height = SIS_SCREEN_HEIGHT + 2; DrawStarConBox (&r, 1, BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19), BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F), TRUE, BLACK_COLOR); r.corner.y = 0; r.extent.height = SIS_ORG_Y; r.corner.x = SIS_ORG_X; r.extent.width = SIS_MESSAGE_BOX_WIDTH; DrawStarConBox (&r, 1, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x0E), 0x54), BUILD_COLOR (MAKE_RGB15 (0x00, 0x01, 0x1C), 0x4E), TRUE, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); r.extent.width = SIS_TITLE_BOX_WIDTH; r.corner.x = SIS_ORG_X + SIS_SCREEN_WIDTH - SIS_TITLE_BOX_WIDTH; DrawStarConBox (&r, 1, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x0E), 0x54), BUILD_COLOR (MAKE_RGB15 (0x00, 0x01, 0x1C), 0x4E), TRUE, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); SetContextForeGroundColor (BLACK_COLOR); r.corner.x = SAFE_X + SPACE_WIDTH - 1; r.corner.y = 0; r.extent.width = 1; r.extent.height = SCREEN_HEIGHT; DrawFilledRectangle (&r); r.corner.x = SAFE_X + SPACE_WIDTH; r.corner.y = SAFE_Y + 139; DrawPoint (&r.corner); r.corner.x = SCREEN_WIDTH - 1; DrawPoint (&r.corner); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19)); r.corner.y = 1; r.extent.width = 1; r.extent.height = SAFE_Y + SIS_TITLE_HEIGHT; r.corner.x = SIS_ORG_X - 1; DrawFilledRectangle (&r); r.corner.x = SIS_ORG_X + SIS_SCREEN_WIDTH - SIS_TITLE_BOX_WIDTH - 1; DrawFilledRectangle (&r); r.corner.x = 0; r.corner.y = SCREEN_HEIGHT - 1; r.extent.width = SAFE_X + SPACE_WIDTH - 1; r.extent.height = 1; DrawFilledRectangle (&r); r.corner.x = SAFE_X + SPACE_WIDTH - 2; r.corner.y = 0; r.extent.width = 1; r.extent.height = SCREEN_HEIGHT - 1; DrawFilledRectangle (&r); r.corner.x = SCREEN_WIDTH - 1; r.corner.y = 0; r.extent.width = 1; r.extent.height = SAFE_Y + 139; DrawFilledRectangle (&r); r.corner.x = SAFE_X + SPACE_WIDTH; r.corner.y = SCREEN_HEIGHT - 1; r.extent.width = SCREEN_WIDTH - r.corner.x; r.extent.height = 1; DrawFilledRectangle (&r); r.corner.x = SCREEN_WIDTH - 1; r.corner.y = SAFE_Y + 140; r.extent.width = 1; r.extent.height = (SCREEN_HEIGHT - 1) - r.corner.y; DrawFilledRectangle (&r); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F)); r.corner.y = 1; r.extent.width = 1; r.extent.height = SAFE_Y + SIS_MESSAGE_HEIGHT; r.corner.x = SIS_ORG_X + SIS_MESSAGE_BOX_WIDTH; DrawFilledRectangle (&r); r.corner.x = SIS_ORG_X + SIS_SCREEN_WIDTH; ++r.extent.height; DrawFilledRectangle (&r); r.corner.y = 0; r.extent.width = (SAFE_X + SPACE_WIDTH - 2) - r.corner.x; r.extent.height = 1; DrawFilledRectangle (&r); r.corner.x = 0; r.extent.width = SIS_ORG_X - r.corner.x; DrawFilledRectangle (&r); r.corner.x = SIS_ORG_X + SIS_MESSAGE_BOX_WIDTH; r.extent.width = SIS_SPACER_BOX_WIDTH; DrawFilledRectangle (&r); r.corner.x = 0; r.corner.y = 1; r.extent.width = 1; r.extent.height = (SCREEN_HEIGHT - 1) - r.corner.y; DrawFilledRectangle (&r); r.corner.x = SAFE_X + SPACE_WIDTH; r.corner.y = 0; r.extent.width = 1; r.extent.height = SAFE_Y + 139; DrawFilledRectangle (&r); r.corner.x = SAFE_X + SPACE_WIDTH + 1; r.corner.y = SAFE_Y + 139; r.extent.width = STATUS_WIDTH - 2; r.extent.height = 1; DrawFilledRectangle (&r); r.corner.x = SAFE_X + SPACE_WIDTH; r.corner.y = SAFE_Y + 140; r.extent.width = 1; r.extent.height = SCREEN_HEIGHT - r.corner.y; DrawFilledRectangle (&r); } InitSISContexts (); ClearSISRect (DRAW_SIS_DISPLAY); UnbatchGraphics (); }
static COUNT initialize_dual_weapons (ELEMENT *ShipPtr, HELEMENT WeaponArray[]) { #define CENTER_OFFS DISPLAY_TO_WORLD (4) COORD cx, cy; COUNT facing, angle; SIZE offs_x, offs_y; STARSHIP *StarShipPtr; GetElementStarShip (ShipPtr, &StarShipPtr); facing = StarShipPtr->ShipFacing; angle = FACING_TO_ANGLE (facing); cx = ShipPtr->next.location.x + COSINE (angle, CENTER_OFFS); cy = ShipPtr->next.location.y + SINE (angle, CENTER_OFFS); if (ShipPtr->next.image.farray == StarShipPtr->RaceDescPtr->ship_data.ship) { #define WING_OFFS DISPLAY_TO_WORLD (10) COORD ex, ey; LASER_BLOCK LaserBlock; ELEMENT *LaserPtr; LaserBlock.sender = ShipPtr->state_flags & (GOOD_GUY | BAD_GUY); LaserBlock.pixoffs = 0; LaserBlock.color = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0A, 0x0A), 0x0C); LaserBlock.face = facing; ex = cx + COSINE (angle, LASER_RANGE); ey = cy + SINE (angle, LASER_RANGE); offs_x = -SINE (angle, WING_OFFS); offs_y = COSINE (angle, WING_OFFS); LaserBlock.cx = cx + offs_x; LaserBlock.cy = cy + offs_y; LaserBlock.ex = ex - LaserBlock.cx; LaserBlock.ey = ey - LaserBlock.cy; if ((WeaponArray[0] = initialize_laser (&LaserBlock))) { LockElement (WeaponArray[0], &LaserPtr); LaserPtr->collision_func = twin_laser_collision; UnlockElement (WeaponArray[0]); } LaserBlock.cx = cx - offs_x; LaserBlock.cy = cy - offs_y; LaserBlock.ex = ex - LaserBlock.cx; LaserBlock.ey = ey - LaserBlock.cy; if ((WeaponArray[1] = initialize_laser (&LaserBlock))) { LockElement (WeaponArray[1], &LaserPtr); LaserPtr->collision_func = twin_laser_collision; UnlockElement (WeaponArray[1]); } } else { #define MISSILE_HITS 1 #define MISSILE_DAMAGE 1 #define MISSILE_OFFSET 0 #define MISSILE_LIFE 40 #define LAUNCH_OFFS DISPLAY_TO_WORLD (4) MISSILE_BLOCK TorpBlock; ELEMENT *TorpPtr; TorpBlock.farray = StarShipPtr->RaceDescPtr->ship_data.weapon; TorpBlock.sender = (ShipPtr->state_flags & (GOOD_GUY | BAD_GUY)) | IGNORE_SIMILAR; TorpBlock.pixoffs = 0; TorpBlock.speed = MISSILE_SPEED; TorpBlock.hit_points = MISSILE_HITS; TorpBlock.damage = MISSILE_DAMAGE; TorpBlock.life = MISSILE_LIFE; TorpBlock.preprocess_func = missile_preprocess; TorpBlock.blast_offs = MISSILE_OFFSET; TorpBlock.face = TorpBlock.index = NORMALIZE_FACING (facing - 1); offs_x = -SINE (FACING_TO_ANGLE (TorpBlock.face), LAUNCH_OFFS); offs_y = COSINE (FACING_TO_ANGLE (TorpBlock.face), LAUNCH_OFFS); TorpBlock.cx = cx + offs_x; TorpBlock.cy = cy + offs_y; if ((WeaponArray[0] = initialize_missile (&TorpBlock))) { LockElement (WeaponArray[0], &TorpPtr); TorpPtr->turn_wait = TRACK_WAIT; UnlockElement (WeaponArray[0]); } TorpBlock.face = TorpBlock.index = NORMALIZE_FACING (facing + 1); TorpBlock.cx = cx - offs_x; TorpBlock.cy = cy - offs_y; if ((WeaponArray[1] = initialize_missile (&TorpBlock))) { LockElement (WeaponArray[1], &TorpPtr); TorpPtr->turn_wait = TRACK_WAIT; UnlockElement (WeaponArray[1]); } } return (2); }
void DrawPlanetSurfaceBorder (void) { CONTEXT oldContext; RECT oldClipRect; RECT clipRect; RECT r; oldContext = SetContext (SpaceContext); GetContextClipRect (&oldClipRect); // Expand the context clip-rect so that we can tweak the existing border clipRect = oldClipRect; clipRect.corner.x -= 1; clipRect.extent.width += 2; clipRect.extent.height += 1; SetContextClipRect (&clipRect); BatchGraphics (); // Border bulk SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); r.corner.x = 0; r.corner.y = clipRect.extent.height - MAP_HEIGHT - MAP_BORDER_HEIGHT; r.extent.width = clipRect.extent.width; r.extent.height = MAP_BORDER_HEIGHT - 2; DrawFilledRectangle (&r); SetContextForeGroundColor (SIS_BOTTOM_RIGHT_BORDER_COLOR); // Border top shadow line r.extent.width -= 1; r.extent.height = 1; r.corner.x = 1; r.corner.y -= 1; DrawFilledRectangle (&r); // XXX: We will need bulk left and right rects here if MAP_WIDTH changes // Right shadow line r.extent.width = 1; r.extent.height = MAP_HEIGHT + 2; r.corner.y += MAP_BORDER_HEIGHT - 1; r.corner.x = clipRect.extent.width - 1; DrawFilledRectangle (&r); SetContextForeGroundColor (SIS_LEFT_BORDER_COLOR); // Left shadow line r.corner.x -= MAP_WIDTH + 1; DrawFilledRectangle (&r); // Border bottom shadow line r.extent.width = MAP_WIDTH + 2; r.extent.height = 1; DrawFilledRectangle (&r); UnbatchGraphics (); SetContextClipRect (&oldClipRect); SetContext (oldContext); }
static void ilwrath_preprocess (ELEMENT *ElementPtr) { STATUS_FLAGS status_flags; STARSHIP *StarShipPtr; PRIMITIVE *lpPrim; GetElementStarShip (ElementPtr, &StarShipPtr); status_flags = StarShipPtr->cur_status_flags; lpPrim = &(GLOBAL (DisplayArray))[ElementPtr->PrimIndex]; if (GetPrimType (lpPrim) == STAMPFILL_PRIM) { Color color; BOOLEAN weapon_discharge; color = GetPrimColor (lpPrim); weapon_discharge = ((status_flags & WEAPON) && StarShipPtr->RaceDescPtr->ship_info.energy_level >= WEAPON_ENERGY_COST); if ( weapon_discharge || ( StarShipPtr->special_counter == 0 && ( ((!sameColor(color, BLACK_COLOR)) && (!sameColor(color, INVIS_COLOR))) || status_flags & SPECIAL ) ) ) { if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F))) SetPrimType (lpPrim, STAMP_PRIM); else if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x0B))) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)); else if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x14), 0x03))) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x0B)); else if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x1F), 0x09))) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x14), 0x03)); else if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01))) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x1F), 0x09)); else { ProcessSound (SetAbsSoundIndex ( /* CLOAKING_OFF */ StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 2), ElementPtr); SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); } ElementPtr->state_flags |= CHANGING; status_flags &= ~SPECIAL; StarShipPtr->special_counter = 0; } else if ( (!sameColor (color, BLACK_COLOR)) && (!sameColor (color, INVIS_COLOR))) { if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01))) { if(PlayerControl[ElementPtr->playerNr] & HUMAN_CONTROL) SetPrimColor (lpPrim, INVIS_COLOR); else SetPrimColor (lpPrim, BLACK_COLOR); Untarget (ElementPtr); } else if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x1F), 0x09))) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); else if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x14), 0x03))) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x1F), 0x09)); else if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x0B))) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x14), 0x03)); else SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x0B)); ElementPtr->state_flags |= CHANGING; } } if ((status_flags & SPECIAL) && StarShipPtr->special_counter == 0 && DeltaEnergy (ElementPtr, -SPECIAL_ENERGY_COST)) { SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)); SetPrimType (lpPrim, STAMPFILL_PRIM); ProcessSound (SetAbsSoundIndex ( /* CLOAKING_ON */ StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 1), ElementPtr); StarShipPtr->special_counter = StarShipPtr->RaceDescPtr->characteristics.special_wait; ElementPtr->state_flags |= CHANGING; } }
static BOOLEAN RestartMenu (MENU_STATE *pMS) { TimeCount TimeOut; ReinitQueue (&race_q[0]); ReinitQueue (&race_q[1]); SetContext (ScreenContext); GLOBAL (CurrentActivity) |= CHECK_ABORT; if (GLOBAL_SIS (CrewEnlisted) == (COUNT)~0 && GET_GAME_STATE (UTWIG_BOMB_ON_SHIP) && !GET_GAME_STATE (UTWIG_BOMB)) { // player blew himself up with Utwig bomb SET_GAME_STATE (UTWIG_BOMB_ON_SHIP, 0); SleepThreadUntil (FadeScreen (FadeAllToWhite, ONE_SECOND / 8) + ONE_SECOND / 60); SetContextBackGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)); ClearDrawable (); FlushColorXForms (); TimeOut = ONE_SECOND / 8; } else { TimeOut = ONE_SECOND / 2; if (LOBYTE (LastActivity) == WON_LAST_BATTLE) { GLOBAL (CurrentActivity) = WON_LAST_BATTLE; Victory (); Credits (TRUE); FreeGameData (); GLOBAL (CurrentActivity) = CHECK_ABORT; } } LastActivity = 0; NextActivity = 0; // TODO: This fade is not always necessary, especially after a splash // screen. It only makes a user wait. SleepThreadUntil (FadeScreen (FadeAllToBlack, TimeOut)); if (TimeOut == ONE_SECOND / 8) SleepThread (ONE_SECOND * 3); pMS->CurFrame = CaptureDrawable (LoadGraphic (RESTART_PMAP_ANIM)); DrawRestartMenuGraphic (pMS); GLOBAL (CurrentActivity) &= ~CHECK_ABORT; SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN, MENU_SOUND_SELECT); SetDefaultMenuRepeatDelay (); DoInput (pMS, TRUE); StopMusic (); if (pMS->hMusic) { DestroyMusic (pMS->hMusic); pMS->hMusic = 0; } Flash_terminate (pMS->flashContext); pMS->flashContext = 0; DestroyDrawable (ReleaseDrawable (pMS->CurFrame)); pMS->CurFrame = 0; if (GLOBAL (CurrentActivity) == (ACTIVITY)~0) return (FALSE); // timed out if (GLOBAL (CurrentActivity) & CHECK_ABORT) return (FALSE); // quit TimeOut = FadeScreen (FadeAllToBlack, ONE_SECOND / 2); SleepThreadUntil (TimeOut); FlushColorXForms (); SeedRandomNumbers (); return (LOBYTE (GLOBAL (CurrentActivity)) != SUPER_MELEE); }
void DrawCaptainsWindow (STARSHIP *StarShipPtr) { COORD y; COORD y_offs; RECT r; STAMP s; FRAME Frame; RACE_DESC *RDPtr; RDPtr = StarShipPtr->RaceDescPtr; Frame = RDPtr->ship_data.captain_control.background; if (Frame) { Frame = SetAbsFrameIndex (Frame, 0); RDPtr->ship_data.captain_control.background = Frame; Frame = SetRelFrameIndex (Frame, 1); RDPtr->ship_data.captain_control.turn = Frame; Frame = SetRelFrameIndex (Frame, 5); RDPtr->ship_data.captain_control.thrust = Frame; Frame = SetRelFrameIndex (Frame, 3); RDPtr->ship_data.captain_control.weapon = Frame; Frame = SetRelFrameIndex (Frame, 3); RDPtr->ship_data.captain_control.special = Frame; } BatchGraphics (); assert (StarShipPtr->playerNr >= 0); y_offs = status_y_offsets[StarShipPtr->playerNr]; r.corner.x = CAPTAIN_XOFFS - 2; r.corner.y = y_offs + SHIP_INFO_HEIGHT; r.extent.width = STATUS_WIDTH - CAPTAIN_XOFFS; r.extent.height = SHIP_STATUS_HEIGHT - CAPTAIN_YOFFS + 2; SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); DrawFilledRectangle (&r); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F)); r.corner.x = 1; r.corner.y = y_offs + SHIP_INFO_HEIGHT; r.extent.width = 1; r.extent.height = (SHIP_STATUS_HEIGHT - SHIP_INFO_HEIGHT - 2); DrawFilledRectangle (&r); r.corner.x = 0; ++r.extent.height; DrawFilledRectangle (&r); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19)); r.corner.x = STATUS_WIDTH - 1; r.corner.y = y_offs + SHIP_INFO_HEIGHT; r.extent.width = 1; r.extent.height = SHIP_STATUS_HEIGHT - SHIP_INFO_HEIGHT; DrawFilledRectangle (&r); r.corner.x = STATUS_WIDTH - 2; DrawFilledRectangle (&r); r.corner.x = 1; r.extent.width = STATUS_WIDTH - 2; r.corner.y = y_offs + (SHIP_STATUS_HEIGHT - 2); r.extent.height = 1; DrawFilledRectangle (&r); r.corner.x = 0; ++r.extent.width; ++r.corner.y; DrawFilledRectangle (&r); y = y_offs + CAPTAIN_YOFFS; SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F)); r.corner.x = 59; r.corner.y = y; r.extent.width = 1; r.extent.height = 30; DrawFilledRectangle (&r); r.corner.x = 3; r.corner.y += 30; r.extent.width = 57; r.extent.height = 1; DrawFilledRectangle (&r); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19)); r.corner.x = 3; r.extent.width = 57; r.corner.y = y - 1; r.extent.height = 1; DrawFilledRectangle (&r); r.corner.x = 3; r.extent.width = 1; r.corner.y = y; r.extent.height = 30; DrawFilledRectangle (&r); s.frame = RDPtr->ship_data.captain_control.background; s.origin.x = CAPTAIN_XOFFS; s.origin.y = y; DrawStamp (&s); if (StarShipPtr->captains_name_index == 0 && StarShipPtr->playerNr == RPG_PLAYER_NUM) { // This is SIS TEXT t; t.baseline.x = STATUS_WIDTH >> 1; t.baseline.y = y + 6; t.align = ALIGN_CENTER; t.pStr = GLOBAL_SIS (CommanderName); t.CharCount = (COUNT)~0; SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x00), 0x02)); SetContextFont (TinyFont); font_DrawText (&t); }
void DrawCaptainsWindow (STARSHIP *StarShipPtr) { COORD y; COORD y_offs; RECT r; STAMP s; FRAME Frame; RACE_DESC *RDPtr; RDPtr = StarShipPtr->RaceDescPtr; Frame = RDPtr->ship_data.captain_control.background; if (Frame) { Frame = SetAbsFrameIndex (Frame, 0); RDPtr->ship_data.captain_control.background = Frame; Frame = SetRelFrameIndex (Frame, 1); RDPtr->ship_data.captain_control.turn = Frame; Frame = SetRelFrameIndex (Frame, 5); RDPtr->ship_data.captain_control.thrust = Frame; Frame = SetRelFrameIndex (Frame, 3); RDPtr->ship_data.captain_control.weapon = Frame; Frame = SetRelFrameIndex (Frame, 3); RDPtr->ship_data.captain_control.special = Frame; } BatchGraphics (); // Grey area under and around captain's window. assert (StarShipPtr->playerNr >= 0); y_offs = status_y_offsets[StarShipPtr->playerNr]; r.corner.x = CAPTAIN_XOFFS - RES_STAT_SCALE(4); // JMS_GFX r.corner.y = y_offs + SHIP_INFO_HEIGHT; r.extent.width = STATUS_WIDTH - 2; r.extent.height = SHIP_STATUS_HEIGHT - CAPTAIN_YOFFS + (4 << RESOLUTION_FACTOR); // JMS_GFX SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); DrawFilledRectangle (&r); // Left border of the status panel. SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F)); r.corner.x = 1; r.corner.y = y_offs + SHIP_INFO_HEIGHT; r.extent.width = 1; r.extent.height = (SHIP_STATUS_HEIGHT - SHIP_INFO_HEIGHT - 2); DrawFilledRectangle (&r); r.corner.x = 0; ++r.extent.height; DrawFilledRectangle (&r); // Lower and right border of the status panel. SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19)); r.corner.x = STATUS_WIDTH - 1; r.corner.y = y_offs + SHIP_INFO_HEIGHT; r.extent.width = 1; r.extent.height = SHIP_STATUS_HEIGHT - SHIP_INFO_HEIGHT; DrawFilledRectangle (&r); r.corner.x = STATUS_WIDTH - 2; DrawFilledRectangle (&r); r.corner.x = 1; r.extent.width = STATUS_WIDTH - 2; r.corner.y = y_offs + (SHIP_STATUS_HEIGHT - 2); r.extent.height = 1; DrawFilledRectangle (&r); r.corner.x = 0; ++r.extent.width; ++r.corner.y; DrawFilledRectangle (&r); y = y_offs + CAPTAIN_YOFFS; // Darker grey rectangle at bottom and right of captain's window SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F)); r.corner.x = CAPTAIN_WIDTH + CAPTAIN_XOFFS; r.corner.y = y; r.extent.width = 1; r.extent.height = CAPTAIN_HEIGHT; DrawFilledRectangle (&r); r.corner.x = CAPTAIN_XOFFS - 1; r.corner.y += CAPTAIN_HEIGHT; r.extent.width = CAPTAIN_WIDTH + 2; r.extent.height = 1; DrawFilledRectangle (&r); // Light grey rectangle at top and left of captains window SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19)); r.corner.x = CAPTAIN_XOFFS - 1; r.extent.width = CAPTAIN_WIDTH + 2; r.corner.y = y - 1; r.extent.height = 1; DrawFilledRectangle (&r); r.corner.x = CAPTAIN_XOFFS - 1; r.extent.width = 1; r.corner.y = y; r.extent.height = CAPTAIN_HEIGHT; DrawFilledRectangle (&r); s.frame = RDPtr->ship_data.captain_control.background; s.origin.x = CAPTAIN_XOFFS; s.origin.y = y; DrawStamp (&s); if (StarShipPtr->captains_name_index == 0 && StarShipPtr->playerNr == RPG_PLAYER_NUM) { // This is SIS TEXT t; t.baseline.x = STATUS_WIDTH >> 1; t.baseline.y = y + RES_CASE(6,-22,-44); // JMS_GFX t.align = ALIGN_CENTER; t.pStr = GLOBAL_SIS (CommanderName); t.CharCount = (COUNT)~0; SetContextForeGroundColor (RES_CASE(BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x00), 0x02), BLACK_COLOR, BLACK_COLOR)); SetContextFont (TinyFont); font_DrawText (&t); }
static void destruct_preprocess (ELEMENT *ElementPtr) { #define DESTRUCT_SWITCH ((NUM_EXPLOSION_FRAMES * 3) - 3) PRIMITIVE *lpPrim; // ship_death() set the ship element's life_span to // (NUM_EXPLOSION_FRAMES * 3) lpPrim = &(GLOBAL (DisplayArray))[ElementPtr->PrimIndex]; ElementPtr->state_flags |= CHANGING; if (ElementPtr->life_span > DESTRUCT_SWITCH) { // First, stamp-fill the ship's own element with changing colors // for 3 frames. No explosion element yet. SetPrimType (lpPrim, STAMPFILL_PRIM); if (ElementPtr->life_span == DESTRUCT_SWITCH + 2) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x0A), 0x0E)); else SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)); } else if (ElementPtr->life_span < DESTRUCT_SWITCH) { // Stamp-fill the explosion element with cycling colors for the // remainder of the glory explosion frames. Color color = GetPrimColor (lpPrim); ElementPtr->next.image.frame = IncFrameIndex (ElementPtr->current.image.frame); if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F))) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x0A), 0x0E)); else if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x0A), 0x0E))) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0A, 0x0A), 0x0C)); else if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0A, 0x0A), 0x0C))) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x14, 0x0A, 0x00), 0x06)); else if (sameColor (color, BUILD_COLOR (MAKE_RGB15 (0x14, 0x0A, 0x00), 0x06))) SetPrimColor (lpPrim, BUILD_COLOR (MAKE_RGB15 (0x14, 0x00, 0x00), 0x04)); } else { HELEMENT hDestruct; SetPrimType (lpPrim, NO_PRIM); // The ship's own element will not be drawn anymore but will remain // alive all through the glory explosion. ElementPtr->preprocess_func = NULL; // Spawn a separate glory explosion element. // XXX: Why? Why not keep using the ship's element? // Is it because of conflicting state_flags, hit_points or // mass_points? hDestruct = AllocElement (); if (hDestruct) { ELEMENT *DestructPtr; STARSHIP *StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); PutElement (hDestruct); LockElement (hDestruct, &DestructPtr); SetElementStarShip (DestructPtr, StarShipPtr); DestructPtr->hit_points = DestructPtr->mass_points = 0; DestructPtr->playerNr = NEUTRAL_PLAYER_NUM; DestructPtr->state_flags = APPEARING | FINITE_LIFE | NONSOLID; DestructPtr->life_span = (NUM_EXPLOSION_FRAMES - 3) - 1; SetPrimType (&(GLOBAL (DisplayArray))[DestructPtr->PrimIndex], STAMPFILL_PRIM); SetPrimColor (&(GLOBAL (DisplayArray))[DestructPtr->PrimIndex], BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)); DestructPtr->current.image.farray = StarShipPtr->RaceDescPtr->ship_data.special; DestructPtr->current.image.frame = StarShipPtr->RaceDescPtr->ship_data.special[0]; DestructPtr->current.location = ElementPtr->current.location; DestructPtr->preprocess_func = destruct_preprocess; DestructPtr->postprocess_func = NULL; DestructPtr->death_func = NULL; ZeroVelocityComponents (&DestructPtr->velocity); UnlockElement (hDestruct); } } }