/* * CalcHalfRampXlat: Make pXlat a palette translation where the the byMask * part of the index is changed from byFromRamp to byToRamp. Other colors * not matching byFromRamp are unaffected. * The index is halved to translate to a half ramp; byToRampOffset is added * to the result to move the half-ramp inside its enclosing ramp. */ void CalcHalfRampXlat(HPALETTE hPalette, xlat* pXlat, BYTE byMask, BYTE byFromRamp, BYTE byToRamp, BYTE byToRampOffset, BOOL bIdentity) { int i; if (bIdentity) *pXlat = *FindStandardXlat(XLAT_IDENTITY); for (i = 0; i < NUM_COLORS; i++) { if ((i & byMask) == byFromRamp) pXlat->entry[i] = (((i & ~byMask) / 2) | byToRamp) + byToRampOffset; } }
/* * CalcRampMoveXlat: Make pXlat a translation that moves the given ramp * (whose byMask matches byFromRamp) to the given indexes. */ void CalcRampMoveXlat(HPALETTE hPalette, xlat* pXlat, BYTE byMask, BYTE byFromRamp, BYTE *indexes, BOOL bIdentity) { int i; int count; if (bIdentity) *pXlat = *FindStandardXlat(XLAT_IDENTITY); count = 0; for (i = 0; i < NUM_COLORS; i++) { if ((i & byMask) == byFromRamp) { pXlat->entry[i] = indexes[count]; count++; } } }
/* * CalcRampOffsetXlat: Make pXlat a palette translation where the the byMask * part of the index is changed to another ramp at a given ramp offset. * Known ramps are defined in the static global ramps[]. * Unlike other ramp routines in here, this assumes the ramps are sixteen * colors aligned to sixteens, such as 0x30-0x3F, or 0xA0-0xAF. */ void CalcRampOffsetXlat(HPALETTE hPalette, xlat* pXlat, int iOffset) { int i, j, r; *pXlat = *FindStandardXlat(XLAT_IDENTITY); // Number of defined ramps. j = sizeof(ramps)/sizeof(ramps[0]); // If offset is negative, add enough multiples of J to make it positive. if (iOffset < 0) iOffset += (1-iOffset/j)*j; // For each ramp, for each element in the ramp, // change the high nibble to the offset ramp's high nibble. // for (r = 0; r < j; r++) { for (i = ramps[r]; i < (ramps[r]+0x10); i++) { pXlat->entry[i] = ((i & 0x0F) | ramps[(r+iOffset+j)%j]); } } }
void DrawPostOverlayEffects(room_type* room, Draw3DParams* params) { static DWORD timeLastFrame = 0; DWORD timeCurrent, timeDelta; int amount; timeCurrent = timeGetTime(); timeDelta = timeCurrent - timeLastFrame; timeLastFrame = timeCurrent; // May be drawn over room or map. // Blurred Vision. if (effects.blur) { // Blur by 1-EFFECT_BLUR_AMPLITUDE pixels amount = (effects.blur / EFFECT_BLUR_RATE) % (2 * EFFECT_BLUR_AMPLITUDE); if (amount > EFFECT_BLUR_AMPLITUDE) amount = 2 * EFFECT_BLUR_AMPLITUDE - amount; amount++; BlurDib(gBits, MAXX, MAXY, amount); RedrawAll(); if (!config.animate) effects.blur = 0; } // Wavering Vision. if (effects.waver) { static int offset = 0; offset++; WaverDib(gBits, MAXX, MAXY, offset); RedrawAll(); if (!config.animate) effects.waver = 0; } // Flash of XLAT. Could be color, blindness, whatever. if (effects.flashxlat != XLAT_IDENTITY) { XlatDib(gBits, MAXX, MAXY, FindStandardXlat(effects.flashxlat)); effects.duration -= (int)timeDelta; if (effects.duration <= 0) { effects.flashxlat = XLAT_IDENTITY; effects.duration = 0; } } if (effects.xlatOverride > 0) { XlatDib(gBits, MAXX, MAXY, FindStandardXlat(effects.xlatOverride)); RedrawAll(); return; } // Whiteout if (effects.whiteout > 500) XlatDib(gBits, MAXX, MAXY, FindStandardXlat(XLAT_BLEND100WHITE)); else if (effects.whiteout > 250) XlatDib(gBits, MAXX, MAXY, FindStandardXlat(XLAT_BLEND90WHITE)); else if (effects.whiteout > 0) XlatDib(gBits, MAXX, MAXY, FindStandardXlat(XLAT_BLEND80WHITE)); if (!config.animate && effects.whiteout) { // Whiteout always shows up, but if not animating, it doesn't fade out, it blinks. effects.whiteout = 0; RedrawAll(); } // Pain (always drawn last). if (!config.pain) return; if (effects.pain > 2000) XlatDib(gBits, MAXX, MAXY, FindStandardXlat(XLAT_BLEND80RED)); else if (effects.pain > 1000) XlatDib(gBits, MAXX, MAXY, FindStandardXlat(XLAT_BLEND70RED)); else if (effects.pain > 500) XlatDib(gBits, MAXX, MAXY, FindStandardXlat(XLAT_BLEND60RED)); else if (effects.pain > 400) XlatDib(gBits, MAXX, MAXY, FindStandardXlat(XLAT_BLEND50RED)); else if (effects.pain > 300) XlatDib(gBits, MAXX, MAXY, FindStandardXlat(XLAT_BLEND40RED)); else if (effects.pain > 200) XlatDib(gBits, MAXX, MAXY, FindStandardXlat(XLAT_BLEND30RED)); else if (effects.pain > 100) XlatDib(gBits, MAXX, MAXY, FindStandardXlat(XLAT_BLEND20RED)); else if (effects.pain) XlatDib(gBits, MAXX, MAXY, FindStandardXlat(XLAT_BLEND10RED)); if (!config.animate && effects.pain) { // Pain always shows up, but if not animating, it doesn't fade out, it blinks. effects.pain = 0; RedrawAll(); } }
void InitStandardXlats(HPALETTE hPalette) { int i, j, nRamps; xlat* pIdentity = FindStandardXlat(XLAT_IDENTITY); xlat* pXlat = pIdentity; for (i = 0; i < NUM_COLORS; i++) pXlat->entry[i] = i; CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND10RED), RGB(255, 0, 0), 90, 10); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND20RED), RGB(255, 0, 0), 80, 20); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND30RED), RGB(255, 0, 0), 70, 30); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND40RED), RGB(255, 0, 0), 60, 40); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND50RED), RGB(255, 0, 0), 50, 50); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND60RED), RGB(255, 0, 0), 40, 60); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND70RED), RGB(255, 0, 0), 30, 70); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND80RED), RGB(255, 0, 0), 20, 80); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND90RED), RGB(255, 0, 0), 10, 90); //CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND100RED), RGB(255, 0, 0), 0, 100); pXlat = FindStandardXlat(XLAT_BLEND100RED); for (i = 0; i < NUM_COLORS; i++) pXlat->entry[i] = 0x10; CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND10WHITE), RGB(255, 255, 255), 90, 10); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND20WHITE), RGB(255, 255, 255), 80, 20); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND30WHITE), RGB(255, 255, 255), 70, 30); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND40WHITE), RGB(255, 255, 255), 60, 40); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND50WHITE), RGB(255, 255, 255), 50, 50); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND60WHITE), RGB(255, 255, 255), 40, 60); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND70WHITE), RGB(255, 255, 255), 30, 70); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND80WHITE), RGB(255, 255, 255), 20, 80); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND90WHITE), RGB(255, 255, 255), 10, 90); //CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND100WHITE), RGB(255, 255, 255), 0, 100); pXlat = FindStandardXlat(XLAT_BLEND100WHITE); for (i = 0; i < NUM_COLORS; i++) pXlat->entry[i] = 255; CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND25YELLOW), RGB(255, 255, 0), 75, 25); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND25RED), RGB(255, 0, 0), 75, 25); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND25GREEN), RGB(0, 255, 0), 75, 25); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND25BLUE), RGB(0, 0, 255), 75, 25); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND50RED), RGB(255, 0, 0), 50, 50); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND50GREEN), RGB(0, 255, 0), 50, 50); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND50BLUE), RGB(0, 0, 255), 50, 50); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND75RED), RGB(255, 0, 0), 25, 75); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND75GREEN), RGB(0, 255, 0), 25, 75); CalcBlendXlat(hPalette, FindStandardXlat(XLAT_BLEND75BLUE), RGB(0, 0, 255), 25, 75); CalcFilterXlat(hPalette, FindStandardXlat(XLAT_FILTERRED), RGB(255, 0, 0)); CalcFilterXlat(hPalette, FindStandardXlat(XLAT_FILTERGREEN), RGB(0, 255, 0)); CalcFilterXlat(hPalette, FindStandardXlat(XLAT_FILTERBLUE), RGB(0, 0, 255)); CalcFilterXlat(hPalette, FindStandardXlat(XLAT_FILTERWHITE90), RGB(240, 240, 240)); CalcFilterXlat(hPalette, FindStandardXlat(XLAT_FILTERWHITE80), RGB(220, 220, 220)); CalcFilterXlat(hPalette, FindStandardXlat(XLAT_FILTERWHITE70), RGB(200, 200, 200)); CalcFilterXlat(hPalette, FindStandardXlat(XLAT_FILTERBRIGHT1), RGB(253, 253, 253)); CalcFilterXlat(hPalette, FindStandardXlat(XLAT_FILTERBRIGHT2), RGB(250, 250, 250)); CalcFilterXlat(hPalette, FindStandardXlat(XLAT_FILTERBRIGHT3), RGB(245, 245, 245)); CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTORED), 0xF0, 0xD0, 0x10, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOORANGE), 0xF0, 0xD0, 0x50, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTODGREEN), 0xF0, 0xD0, 0x60, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOBGREEN), 0xF0, 0xD0, 0x70, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOSKY), 0xF0, 0xD0, 0x80, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTODBLUE), 0xF0, 0xD0, 0x90, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOPURPLE), 0xF0, 0xD0, 0xA0, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOGOLD), 0xF0, 0xD0, 0xC0, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOBBLUE), 0xF0, 0xD0, 0xE0, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOLRED), 0xF0, 0xD0, 0x10, 0, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOLORANGE), 0xF0, 0xD0, 0x50, 0, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOLGREEN), 0xF0, 0xD0, 0x60, 0, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOLBGREEN), 0xF0, 0xD0, 0x70, 0, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOLSKY), 0xF0, 0xD0, 0x80, 0, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOLBBLUE), 0xF0, 0xD0, 0x90, 0, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOLPURPLE), 0xF0, 0xD0, 0xA0, 0, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOLGOLD), 0xF0, 0xD0, 0xC0, 0, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOLBLUE), 0xF0, 0xD0, 0xE0, 0, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOKRED), 0xF0, 0xD0, 0x10, 8, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOKORANGE), 0xF0, 0xD0, 0x50, 8, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOKGREEN), 0xF0, 0xD0, 0x60, 8, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOKBGREEN), 0xF0, 0xD0, 0x70, 8, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOKSKY), 0xF0, 0xD0, 0x80, 8, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOKBBLUE), 0xF0, 0xD0, 0x90, 8, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOKPURPLE), 0xF0, 0xD0, 0xA0, 8, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOKGOLD), 0xF0, 0xD0, 0xC0, 8, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOKBLUE), 0xF0, 0xD0, 0xE0, 8, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOKGRAY), 0xF0, 0xD0, 0xD0, 8, TRUE); // Black has lowered light level pXlat = FindStandardXlat(XLAT_GRAYTOBLACK); for (i = 0; i < NUM_COLORS; i++) pXlat->entry[i] = i; CalcLightXlat(hPalette, pXlat, 0xF0, 0xD0, LIGHT_LEVELS / 6); CalcRampMoveXlat(hPalette, FindStandardXlat(XLAT_GRAYTOOLDHAIR1), 0xF0, 0xD0, oldhair1_indexes, TRUE); CalcRampMoveXlat(hPalette, FindStandardXlat(XLAT_GRAYTOOLDHAIR2), 0xF0, 0xD0, oldhair2_indexes, TRUE); CalcRampMoveXlat(hPalette, FindStandardXlat(XLAT_GRAYTOOLDHAIR3), 0xF0, 0xD0, oldhair3_indexes, TRUE); CalcRampMoveXlat(hPalette, FindStandardXlat(XLAT_GRAYTOPLATBLOND), 0xF0, 0xD0, platblond_indexes, TRUE); // Mostly obsolete. CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOSKIN1), 0xF0, 0xD0, 0x20, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOSKIN2), 0xF0, 0xD0, 0x30, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOSKIN3), 0xF0, 0xD0, 0x30, 5, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOSKIN4), 0xF0, 0xD0, 0x40, TRUE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_GRAYTOSKIN5), 0xF0, 0xD0, 0x40, 8, TRUE); // Skin to healthy shades. CalcRampMoveXlat(hPalette, FindStandardXlat(XLAT_DBLUETOSKIN1), 0xF0, 0x90, skin1_indexes, TRUE); CalcRampMoveXlat(hPalette, FindStandardXlat(XLAT_DBLUETOSKIN2), 0xF0, 0x90, skin2_indexes, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_DBLUETOSKIN3), 0xF0, 0x90, 0x30, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_DBLUETOSKIN4), 0xF0, 0x90, 0x40, TRUE); // Skin to sickly effects. CalcRampXlat(hPalette, FindStandardXlat(XLAT_DBLUETOGRAY), 0xF0, 0x90, 0xD0, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_DBLUETOLBLUE), 0xF0, 0x90, 0x80, TRUE); CalcRampMoveXlat(hPalette, FindStandardXlat(XLAT_DBLUETOSICKGREEN), 0xF0, 0x90, green_skin_indexes, TRUE); CalcRampMoveXlat(hPalette, FindStandardXlat(XLAT_DBLUETOSICKYELLOW), 0xF0, 0x90, yellow_skin_indexes, TRUE); // Custom forked color: grey->red while blue->grey. CalcRampXlat(hPalette, FindStandardXlat(XLAT_DBLUETOASHEN), 0xF0, 0x90, 0xD0, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_DBLUETOASHEN), 0xF0, 0xD0, 0x10, FALSE); // Custom forked color: red->dgreen while blue->skin1.5,2,3. CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_REDTODGREEN1), 0xF0, 0x10, 0x70, 8, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_REDTODGREEN1), 0xF0, 0x90, 0x20, FALSE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_REDTODGREEN2), 0xF0, 0x10, 0x70, 8, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_REDTODGREEN2), 0xF0, 0x90, 0x30, FALSE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_REDTODGREEN3), 0xF0, 0x10, 0x70, 8, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_REDTODGREEN3), 0xF0, 0x90, 0x40, FALSE); // Custom forked color: red->black while blue->skin1.5,3,4. CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_REDTOBLACK1), 0xF0, 0x10, 0xD0, 8, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_REDTOBLACK1), 0xF0, 0x90, 0x20, FALSE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_REDTOBLACK2), 0xF0, 0x10, 0xD0, 8, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_REDTOBLACK2), 0xF0, 0x90, 0x30, FALSE); CalcHalfRampXlat(hPalette, FindStandardXlat(XLAT_REDTOBLACK3), 0xF0, 0x10, 0xD0, 8, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_REDTOBLACK3), 0xF0, 0x90, 0x40, FALSE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_PURPLETOLBLUE), 0xF0, 0xA0, 0x80, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_PURPLETOBRED), 0xF0, 0xA0, 0x10, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_PURPLETOGREEN), 0xF0, 0xA0, 0x70, TRUE); CalcRampXlat(hPalette, FindStandardXlat(XLAT_PURPLETOYELLOW), 0xF0, 0xA0, 0x50, TRUE); // Too slow. Done by makepal.exe which writes pal.c now. // CalcBlendBiXlat(hPalette, FindStandardBiXlat(BIXLAT_BLEND50), 50, 50); // Each of these scrolls the ramps up or down. CalcRampOffsetXlat(hPalette, FindStandardXlat(XLAT_RAMPUP1), +1); CalcRampOffsetXlat(hPalette, FindStandardXlat(XLAT_RAMPUP2), +2); CalcRampOffsetXlat(hPalette, FindStandardXlat(XLAT_RAMPDOWN2), -2); CalcRampOffsetXlat(hPalette, FindStandardXlat(XLAT_RAMPDOWN1), -1); // Do the guild shield colors. nRamps = (sizeof(ramps)/sizeof(ramps[0])); for (i = 0; i < nRamps; i++) { for (j = 0; j < nRamps; j++) { pXlat = FindStandardXlat(XLAT_GUILDCOLOR_BASE + i*nRamps + j); *pXlat = *pIdentity; // swap red to ramp i CalcRampXlat(hPalette, pXlat, 0xF0, 0x10/*red*/, ramps[i], FALSE); // swap blue to ramp j CalcRampXlat(hPalette, pXlat, 0xF0, 0x90/*blu*/, ramps[j], FALSE); } } }