From: <Mee...@us...> - 2009-11-28 15:07:48
|
Revision: 3358 http://sc2.svn.sourceforge.net/sc2/?rev=3358&view=rev Author: Meep-Eep Date: 2009-11-28 15:07:38 +0000 (Sat, 28 Nov 2009) Log Message: ----------- Get rid of one abuse of the vga palette index of a COLOR to store state. Modified Paths: -------------- trunk/sc2/src/uqm/element.h trunk/sc2/src/uqm/tactrans.c Modified: trunk/sc2/src/uqm/element.h =================================================================== --- trunk/sc2/src/uqm/element.h 2009-11-28 13:46:56 UTC (rev 3357) +++ trunk/sc2/src/uqm/element.h 2009-11-28 15:07:38 UTC (rev 3358) @@ -123,7 +123,10 @@ COUNT crew_level; COUNT hit_points; COUNT facing; /* Planetside: lava-spot direction of travel */ - COUNT cycle; /* Planetside: lightning cycle length */ + COUNT cycle; + /* Planetside: lightning cycle length + * Melee: color cycle index of ion trails and warp shadows + */ }; union { Modified: trunk/sc2/src/uqm/tactrans.c =================================================================== --- trunk/sc2/src/uqm/tactrans.c 2009-11-28 13:46:56 UTC (rev 3357) +++ trunk/sc2/src/uqm/tactrans.c 2009-11-28 15:07:38 UTC (rev 3358) @@ -578,101 +578,101 @@ #define START_ION_COLOR BUILD_COLOR (MAKE_RGB15 (0x1F, 0x15, 0x00), 0x7A) +// Called from the death_func of an element for an ion trail pixel, or a +// ship shadow (when warping in/out). void -spawn_ion_trail (ELEMENT *ElementPtr) +cycle_ion_trail (ELEMENT *ElementPtr) { - - if (ElementPtr->state_flags & PLAYER_SHIP) + static const COLOR color_tab[] = { - HELEMENT hIonElement; + BUILD_COLOR (MAKE_RGB15 (0x1F, 0x15, 0x00), 0x7a), + BUILD_COLOR (MAKE_RGB15 (0x1F, 0x11, 0x00), 0x7b), + BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0E, 0x00), 0x7c), + BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0A, 0x00), 0x7d), + BUILD_COLOR (MAKE_RGB15 (0x1F, 0x07, 0x00), 0x7e), + BUILD_COLOR (MAKE_RGB15 (0x1F, 0x03, 0x00), 0x7f), + BUILD_COLOR (MAKE_RGB15 (0x1F, 0x00, 0x00), 0x2a), + BUILD_COLOR (MAKE_RGB15 (0x1B, 0x00, 0x00), 0x2b), + BUILD_COLOR (MAKE_RGB15 (0x17, 0x00, 0x00), 0x2c), + BUILD_COLOR (MAKE_RGB15 (0x13, 0x00, 0x00), 0x2d), + BUILD_COLOR (MAKE_RGB15 (0x0F, 0x00, 0x00), 0x2e), + BUILD_COLOR (MAKE_RGB15 (0x0B, 0x00, 0x00), 0x2f), + }; +#define NUM_TAB_COLORS (sizeof color_tab / sizeof color_tab[0]) + + assert (!(ElementPtr->state_flags & PLAYER_SHIP)); - hIonElement = AllocElement (); - if (hIonElement) - { -#define ION_LIFE 1 - COUNT angle; - RECT r; - ELEMENT *IonElementPtr; - STARSHIP *StarShipPtr; + ElementPtr->cycle++; + if (ElementPtr->cycle != NUM_TAB_COLORS) + { + ElementPtr->life_span = ElementPtr->thrust_wait; + // Reset the life span. + + SetPrimColor (&DisplayArray[ElementPtr->PrimIndex], + color_tab[ElementPtr->cycle]); - GetElementStarShip (ElementPtr, &StarShipPtr); - angle = FACING_TO_ANGLE (StarShipPtr->ShipFacing) + HALF_CIRCLE; - GetFrameRect (StarShipPtr->RaceDescPtr->ship_data.ship[0], &r); - r.extent.height = DISPLAY_TO_WORLD (r.extent.height + r.corner.y); + ElementPtr->state_flags &= ~DISAPPEARING; + ElementPtr->state_flags |= CHANGING; + } // else, the element disappears. +} - InsertElement (hIonElement, GetHeadElement ()); - LockElement (hIonElement, &IonElementPtr); - IonElementPtr->playerNr = NEUTRAL_PLAYER_NUM; - IonElementPtr->state_flags = APPEARING | FINITE_LIFE | NONSOLID; - IonElementPtr->life_span = IonElementPtr->thrust_wait = ION_LIFE; - SetPrimType (&DisplayArray[IonElementPtr->PrimIndex], POINT_PRIM); - SetPrimColor (&DisplayArray[IonElementPtr->PrimIndex], - START_ION_COLOR); - IonElementPtr->current.image.frame = - DecFrameIndex (stars_in_space); - IonElementPtr->current.image.farray = &stars_in_space; - IonElementPtr->current.location = ElementPtr->current.location; - IonElementPtr->current.location.x += - (COORD)COSINE (angle, r.extent.height); - IonElementPtr->current.location.y += - (COORD)SINE (angle, r.extent.height); - IonElementPtr->death_func = spawn_ion_trail; +void +spawn_ion_trail (ELEMENT *ElementPtr) +{ + HELEMENT hIonElement; - SetElementStarShip (IonElementPtr, StarShipPtr); + assert (ElementPtr->state_flags & PLAYER_SHIP); - { - /* normally done during preprocess, but because - * object is being inserted at head rather than - * appended after tail it may never get preprocessed. - */ - IonElementPtr->next = IonElementPtr->current; - --IonElementPtr->life_span; - IonElementPtr->state_flags |= PRE_PROCESS; - } - - UnlockElement (hIonElement); - } - } - else + hIonElement = AllocElement (); + if (hIonElement) { - static const COLOR color_tab[] = - { - BUILD_COLOR (MAKE_RGB15 (0x1F, 0x00, 0x00), 0x2a), - BUILD_COLOR (MAKE_RGB15 (0x1B, 0x00, 0x00), 0x2b), - BUILD_COLOR (MAKE_RGB15 (0x17, 0x00, 0x00), 0x2c), - BUILD_COLOR (MAKE_RGB15 (0x13, 0x00, 0x00), 0x2d), - BUILD_COLOR (MAKE_RGB15 (0x0F, 0x00, 0x00), 0x2e), - BUILD_COLOR (MAKE_RGB15 (0x0B, 0x00, 0x00), 0x2f), - BUILD_COLOR (MAKE_RGB15 (0x1F, 0x15, 0x00), 0x7a), - BUILD_COLOR (MAKE_RGB15 (0x1F, 0x11, 0x00), 0x7b), - BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0E, 0x00), 0x7c), - BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0A, 0x00), 0x7d), - BUILD_COLOR (MAKE_RGB15 (0x1F, 0x07, 0x00), 0x7e), - BUILD_COLOR (MAKE_RGB15 (0x1F, 0x03, 0x00), 0x7f), - }; -#define NUM_TAB_COLORS (sizeof (color_tab) / sizeof (color_tab[0])) - - COUNT color_index = 0; - COLOR Color; +#define ION_LIFE 1 + COUNT angle; + RECT r; + ELEMENT *IonElementPtr; + STARSHIP *StarShipPtr; - Color = COLOR_256 (GetPrimColor (&DisplayArray[ElementPtr->PrimIndex])); - if (Color != 0x2F) + GetElementStarShip (ElementPtr, &StarShipPtr); + angle = FACING_TO_ANGLE (StarShipPtr->ShipFacing) + HALF_CIRCLE; + GetFrameRect (StarShipPtr->RaceDescPtr->ship_data.ship[0], &r); + r.extent.height = DISPLAY_TO_WORLD (r.extent.height + r.corner.y); + + InsertElement (hIonElement, GetHeadElement ()); + LockElement (hIonElement, &IonElementPtr); + IonElementPtr->playerNr = NEUTRAL_PLAYER_NUM; + IonElementPtr->state_flags = APPEARING | FINITE_LIFE | NONSOLID; + IonElementPtr->thrust_wait = ION_LIFE; + IonElementPtr->life_span = IonElementPtr->thrust_wait; + // When the element "dies", in the death_func + // 'cycle_ion_trail', it is given new life a number of + // times, by setting life_span to thrust_wait. + SetPrimType (&DisplayArray[IonElementPtr->PrimIndex], POINT_PRIM); + SetPrimColor (&DisplayArray[IonElementPtr->PrimIndex], + START_ION_COLOR); + IonElementPtr->cycle = 0; + IonElementPtr->current.image.frame = + DecFrameIndex (stars_in_space); + IonElementPtr->current.image.farray = &stars_in_space; + IonElementPtr->current.location = ElementPtr->current.location; + IonElementPtr->current.location.x += + (COORD)COSINE (angle, r.extent.height); + IonElementPtr->current.location.y += + (COORD)SINE (angle, r.extent.height); + IonElementPtr->death_func = cycle_ion_trail; + + SetElementStarShip (IonElementPtr, StarShipPtr); + { - ElementPtr->life_span = ElementPtr->thrust_wait; - - ++Color; - if (Color > 0x7F) - Color = 0x2A; - if (Color <= 0x2f && Color >= 0x2a) - color_index = (COUNT)Color - 0x2a; - else /* color is between 0x7a and 0x7f */ - color_index = (COUNT)(Color - 0x7a) + (NUM_TAB_COLORS >> 1); - SetPrimColor (&DisplayArray[ElementPtr->PrimIndex], - color_tab[color_index]); + /* normally done during preprocess, but because + * object is being inserted at head rather than + * appended after tail it may never get preprocessed. + */ + IonElementPtr->next = IonElementPtr->current; + --IonElementPtr->life_span; + IonElementPtr->state_flags |= PRE_PROCESS; + } - ElementPtr->state_flags &= ~DISAPPEARING; - ElementPtr->state_flags |= CHANGING; - } + UnlockElement (hIonElement); } } @@ -743,12 +743,16 @@ LockElement (hShipImage, &ShipImagePtr); ShipImagePtr->playerNr = NEUTRAL_PLAYER_NUM; ShipImagePtr->state_flags = APPEARING | FINITE_LIFE | NONSOLID; - ShipImagePtr->life_span = ShipImagePtr->thrust_wait = - TRANSITION_LIFE; + ShipImagePtr->thrust_wait = TRANSITION_LIFE; + ShipImagePtr->life_span = ShipImagePtr->thrust_wait; + // When the element "dies", in the death_func + // 'cycle_ion_trail', it is given new life a number of + // times, by setting life_span to thrust_wait. SetPrimType (&DisplayArray[ShipImagePtr->PrimIndex], STAMPFILL_PRIM); SetPrimColor (&DisplayArray[ShipImagePtr->PrimIndex], START_ION_COLOR); + ShipImagePtr->cycle = 0; ShipImagePtr->current.image = ElementPtr->current.image; ShipImagePtr->current.location = ElementPtr->current.location; if (!(ElementPtr->state_flags & PLAYER_SHIP)) @@ -774,7 +778,7 @@ WRAP_Y (ShipImagePtr->current.location.y); } ShipImagePtr->preprocess_func = ship_transition; - ShipImagePtr->death_func = spawn_ion_trail; + ShipImagePtr->death_func = cycle_ion_trail; SetElementStarShip (ShipImagePtr, StarShipPtr); UnlockElement (hShipImage); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |