SBarinfo Update #18

- Simplified the DrawGraphic function in sbarinfo_display.cpp
- Added xOffset, yOffset, and alpha to every drawing function in
  sbarinfo_display.cpp.  So Strife popups can be handeled better and allow for
  other effects (translucent bars?).  I'm thinking about making a struct for
  these five (also x and y) arguments so that the argument lists don't become a
  mess.
- Changed DRAWIMAGE in sbarinfo_display.cpp to not use so many calls to
  DrawGraphic.
- DrawKeyBar wasn't using screen->DrawTexture.
- Added a Fade transition for popups.  It takes two args fade in rate and fade
  out rate.  Both are floats (1.0 = 1 tic to complete 0.5 = 2 tics to complete
  and so on).
- Added a translucency arg to statusbars.  1.0 = opaque and 0.0 = invisible.

SVN r939 (trunk)
This commit is contained in:
Christoph Oelckers 2008-04-25 09:40:08 +00:00
parent 6ce25fe6c3
commit 0d29164522
5 changed files with 184 additions and 130 deletions

View file

@ -1,3 +1,18 @@
April 25, 2008 (SBarInfo Update #18)
- Simplified the DrawGraphic function in sbarinfo_display.cpp
- Added xOffset, yOffset, and alpha to every drawing function in
sbarinfo_display.cpp. So Strife popups can be handeled better and allow for
other effects (translucent bars?). I'm thinking about making a struct for
these five (also x and y) arguments so that the argument lists don't become a
mess.
- Changed DRAWIMAGE in sbarinfo_display.cpp to not use so many calls to
DrawGraphic.
- DrawKeyBar wasn't using screen->DrawTexture.
- Added a Fade transition for popups. It takes two args fade in rate and fade
out rate. Both are floats (1.0 = 1 tic to complete 0.5 = 2 tics to complete
and so on).
- Added a translucency arg to statusbars. 1.0 = opaque and 0.0 = invisible.
April 24, 2008 April 24, 2008
- Fixed: When an instrument's envelope runs out, it does not immediately ramp - Fixed: When an instrument's envelope runs out, it does not immediately ramp
to zero. Rather, it lets the remainder of the sample finish playing. to zero. Rather, it lets the remainder of the sample finish playing.

View file

@ -53,6 +53,7 @@ enum PopupTransition
{ {
TRANSITION_NONE, TRANSITION_NONE,
TRANSITION_SLIDEINBOTTOM, TRANSITION_SLIDEINBOTTOM,
TRANSITION_FADE,
}; };
struct Popup struct Popup
@ -63,6 +64,8 @@ struct Popup
int height; int height;
int width; int width;
int speed; int speed;
int speed2;
int alpha;
int x; int x;
int y; int y;
@ -74,6 +77,7 @@ struct Popup
bool isDoneMoving(); bool isDoneMoving();
int getXOffset(); int getXOffset();
int getYOffset(); int getYOffset();
int getAlpha(int maxAlpha=FRACUNIT);
}; };
//SBarInfo //SBarInfo
@ -81,6 +85,8 @@ struct SBarInfoBlock
{ {
TArray<SBarInfoCommand> commands; TArray<SBarInfoCommand> commands;
bool forceScaled; bool forceScaled;
int alpha;
SBarInfoBlock(); SBarInfoBlock();
}; };
@ -372,15 +378,15 @@ public:
void ShowPop(int popnum); void ShowPop(int popnum);
void SetMugShotState(const char* stateName, bool waitTillDone=false); void SetMugShotState(const char* stateName, bool waitTillDone=false);
private: private:
void doCommands(SBarInfoBlock &block, int xOffset=0, int yOffset=0); void doCommands(SBarInfoBlock &block, int xOffset=0, int yOffset=0, int alpha=FRACUNIT);
void DrawGraphic(FTexture* texture, int x, int y, int flags=0); void DrawGraphic(FTexture* texture, int x, int y, int xOffset, int yOffset, int alpha, bool translate=false, bool dim=false, bool center=false);
void DrawString(const char* str, int x, int y, EColorRange translation, int spacing=0); void DrawString(const char* str, int x, int y, int xOffset, int yOffset, int alpha, EColorRange translation, int spacing=0);
void DrawNumber(int num, int len, int x, int y, EColorRange translation, int spacing=0, bool fillzeros=false); void DrawNumber(int num, int len, int x, int y, int xOffset, int yOffset, int alpha, EColorRange translation, int spacing=0, bool fillzeros=false);
void DrawFace(FString &defaultFace, int accuracy, bool xdth, bool animatedgodmode, int x, int y); void DrawFace(FString &defaultFace, int accuracy, bool xdth, bool animatedgodmode, int x, int y, int xOffset, int yOffset, int alpha);
int updateState(bool xdth, bool animatedgodmode); int updateState(bool xdth, bool animatedgodmode);
void DrawInventoryBar(int type, int num, int x, int y, bool alwaysshow, void DrawInventoryBar(int type, int num, int x, int y, int xOffset, int yOffset, int alpha, bool alwaysshow,
int counterx, int countery, EColorRange translation, bool drawArtiboxes, bool noArrows, bool alwaysshowcounter); int counterx, int countery, EColorRange translation, bool drawArtiboxes, bool noArrows, bool alwaysshowcounter);
void DrawGem(FTexture* chain, FTexture* gem, int value, int x, int y, int padleft, int padright, int chainsize, void DrawGem(FTexture* chain, FTexture* gem, int value, int x, int y, int xOffset, int yOffset, int alpha, int padleft, int padright, int chainsize,
bool wiggle, bool translate); bool wiggle, bool translate);
FRemapTable* getTranslation(); FRemapTable* getTranslation();

View file

@ -310,22 +310,25 @@ void DSBarInfo::Draw (EHudState state)
SetScaled(true); SetScaled(true);
setsizeneeded = true; setsizeneeded = true;
} }
doCommands(SBarInfoScript->huds[hud]); doCommands(SBarInfoScript->huds[hud], 0, 0, SBarInfoScript->huds[hud].alpha);
if(CPlayer->inventorytics > 0 && !(level.flags & LEVEL_NOINVENTORYBAR)) if(CPlayer->inventorytics > 0 && !(level.flags & LEVEL_NOINVENTORYBAR))
{ {
if(state == HUD_StatusBar) if(state == HUD_StatusBar)
doCommands(SBarInfoScript->huds[STBAR_INVENTORY]); doCommands(SBarInfoScript->huds[STBAR_INVENTORY], 0, 0, SBarInfoScript->huds[STBAR_INVENTORY].alpha);
else if(state == HUD_Fullscreen) else if(state == HUD_Fullscreen)
doCommands(SBarInfoScript->huds[STBAR_INVENTORYFULLSCREEN]); doCommands(SBarInfoScript->huds[STBAR_INVENTORYFULLSCREEN], 0, 0, SBarInfoScript->huds[STBAR_INVENTORYFULLSCREEN].alpha);
} }
if(currentPopup != POP_None) if(currentPopup != POP_None)
{ {
int popbar = 0;
if(currentPopup == POP_Log) if(currentPopup == POP_Log)
doCommands(SBarInfoScript->huds[STBAR_POPUPLOG], SBarInfoScript->popups[currentPopup].getXOffset(), SBarInfoScript->popups[currentPopup].getYOffset()); popbar = STBAR_POPUPLOG;
else if(currentPopup == POP_Keys) else if(currentPopup == POP_Keys)
doCommands(SBarInfoScript->huds[STBAR_POPUPKEYS], SBarInfoScript->popups[currentPopup].getXOffset(), SBarInfoScript->popups[currentPopup].getYOffset()); popbar = STBAR_POPUPKEYS;
else if(currentPopup == POP_Status) else if(currentPopup == POP_Status)
doCommands(SBarInfoScript->huds[STBAR_POPUPSTATUS], SBarInfoScript->popups[currentPopup].getXOffset(), SBarInfoScript->popups[currentPopup].getYOffset()); popbar = STBAR_POPUPSTATUS;
doCommands(SBarInfoScript->huds[popbar], SBarInfoScript->popups[currentPopup].getXOffset(), SBarInfoScript->popups[currentPopup].getYOffset(),
SBarInfoScript->popups[currentPopup].getAlpha(SBarInfoScript->huds[popbar].alpha));
} }
} }
@ -469,7 +472,7 @@ void DSBarInfo::SetMugShotState(const char* stateName, bool waitTillDone)
} }
} }
void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset) void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int alpha)
{ {
//prepare ammo counts //prepare ammo counts
AAmmo *ammo1, *ammo2; AAmmo *ammo1, *ammo2;
@ -489,8 +492,6 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
for(unsigned int i = 0;i < block.commands.Size();i++) for(unsigned int i = 0;i < block.commands.Size();i++)
{ {
SBarInfoCommand& cmd = block.commands[i]; SBarInfoCommand& cmd = block.commands[i];
cmd.x += xOffset;
cmd.y += yOffset;
switch(cmd.type) //read and execute all the commands switch(cmd.type) //read and execute all the commands
{ {
case SBARINFO_DRAWSWITCHABLEIMAGE: //draw the alt image if we don't have the item else this is like a normal drawimage case SBARINFO_DRAWSWITCHABLEIMAGE: //draw the alt image if we don't have the item else this is like a normal drawimage
@ -545,49 +546,50 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
if(drawAlt != 0) //draw 'off' image if(drawAlt != 0) //draw 'off' image
{ {
if(cmd.special != -1 && drawAlt == 1) if(cmd.special != -1 && drawAlt == 1)
DrawGraphic(Images[cmd.special], cmd.x, cmd.y, cmd.flags); DrawGraphic(Images[cmd.special], cmd.x, cmd.y, xOffset, yOffset, alpha, (cmd.flags & DRAWIMAGE_TRANSLATABLE), false, (cmd.flags & DRAWIMAGE_OFFSET_CENTER));
else if(cmd.special2 != -1 && drawAlt == 2) else if(cmd.special2 != -1 && drawAlt == 2)
DrawGraphic(Images[cmd.special2], cmd.x, cmd.y, cmd.flags); DrawGraphic(Images[cmd.special2], cmd.x, cmd.y, xOffset, yOffset, alpha, (cmd.flags & DRAWIMAGE_TRANSLATABLE), false, (cmd.flags & DRAWIMAGE_OFFSET_CENTER));
else if(cmd.special3 != -1 && drawAlt == 3) else if(cmd.special3 != -1 && drawAlt == 3)
DrawGraphic(Images[cmd.special3], cmd.x, cmd.y, cmd.flags); DrawGraphic(Images[cmd.special3], cmd.x, cmd.y, xOffset, yOffset, alpha, (cmd.flags & DRAWIMAGE_TRANSLATABLE), false, (cmd.flags & DRAWIMAGE_OFFSET_CENTER));
break; break;
} }
} }
case SBARINFO_DRAWIMAGE: case SBARINFO_DRAWIMAGE:
{
FTexture *texture = NULL;
if((cmd.flags & DRAWIMAGE_PLAYERICON)) if((cmd.flags & DRAWIMAGE_PLAYERICON))
DrawGraphic(TexMan[CPlayer->mo->ScoreIcon], cmd.x, cmd.y, cmd.flags); texture = TexMan[CPlayer->mo->ScoreIcon];
else if((cmd.flags & DRAWIMAGE_AMMO1)) else if((cmd.flags & DRAWIMAGE_AMMO1))
{ {
if(ammo1 != NULL) if(ammo1 != NULL)
DrawGraphic(TexMan[ammo1->Icon], cmd.x, cmd.y, cmd.flags); texture = TexMan[ammo1->Icon];
} }
else if((cmd.flags & DRAWIMAGE_AMMO2)) else if((cmd.flags & DRAWIMAGE_AMMO2))
{ {
if(ammo2 != NULL) if(ammo2 != NULL)
DrawGraphic(TexMan[ammo2->Icon], cmd.x, cmd.y, cmd.flags); texture = TexMan[ammo2->Icon];
} }
else if((cmd.flags & DRAWIMAGE_ARMOR)) else if((cmd.flags & DRAWIMAGE_ARMOR))
{ {
if(armor != NULL && armor->Amount != 0) if(armor != NULL && armor->Amount != 0)
DrawGraphic(TexMan(armor->Icon), cmd.x, cmd.y, cmd.flags); texture = TexMan(armor->Icon);
} }
else if((cmd.flags & DRAWIMAGE_WEAPONICON)) else if((cmd.flags & DRAWIMAGE_WEAPONICON))
{ {
AWeapon *weapon = CPlayer->ReadyWeapon; AWeapon *weapon = CPlayer->ReadyWeapon;
if(weapon != NULL && weapon->Icon > 0) if(weapon != NULL && weapon->Icon > 0)
{ {
DrawGraphic(TexMan[weapon->Icon], cmd.x, cmd.y, cmd.flags); texture = TexMan[weapon->Icon];
} }
} }
else if((cmd.flags & DRAWIMAGE_INVENTORYICON)) else if((cmd.flags & DRAWIMAGE_INVENTORYICON))
{ texture = TexMan[cmd.sprite];
DrawGraphic(TexMan[cmd.sprite], cmd.x, cmd.y, cmd.flags);
}
else if(cmd.sprite != -1) else if(cmd.sprite != -1)
{ texture = Images[cmd.sprite];
DrawGraphic(Images[cmd.sprite], cmd.x, cmd.y, cmd.flags);
} DrawGraphic(texture, cmd.x, cmd.y, xOffset, yOffset, alpha, (cmd.flags & DRAWIMAGE_TRANSLATABLE), false, (cmd.flags & DRAWIMAGE_OFFSET_CENTER));
break; break;
}
case SBARINFO_DRAWNUMBER: case SBARINFO_DRAWNUMBER:
{ {
int value = cmd.value; int value = cmd.value;
@ -695,12 +697,12 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
} }
} }
bool fillzeros = !!(cmd.flags & DRAWNUMBER_FILLZEROS); bool fillzeros = !!(cmd.flags & DRAWNUMBER_FILLZEROS);
EColorRange translation = cmd.translation;
if(cmd.special3 != -1 && value <= cmd.special3) //low if(cmd.special3 != -1 && value <= cmd.special3) //low
DrawNumber(value, cmd.special, cmd.x, cmd.y, cmd.translation2, cmd.special2, fillzeros); translation = cmd.translation2;
else if(cmd.special4 != -1 && value >= cmd.special4) //high else if(cmd.special4 != -1 && value >= cmd.special4) //high
DrawNumber(value, cmd.special, cmd.x, cmd.y, cmd.translation3, cmd.special2, fillzeros); translation = cmd.translation3;
else DrawNumber(value, cmd.special, cmd.x, cmd.y, xOffset, yOffset, alpha, translation, cmd.special2, fillzeros);
DrawNumber(value, cmd.special, cmd.x, cmd.y, cmd.translation, cmd.special2, fillzeros);
break; break;
} }
case SBARINFO_DRAWMUGSHOT: case SBARINFO_DRAWMUGSHOT:
@ -711,7 +713,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
xdth = true; xdth = true;
if(cmd.flags & DRAWMUGSHOT_ANIMATEDGODMODE) if(cmd.flags & DRAWMUGSHOT_ANIMATEDGODMODE)
animatedgodmode = true; animatedgodmode = true;
DrawFace(cmd.string[0], cmd.special, xdth, animatedgodmode, cmd.x, cmd.y); DrawFace(cmd.string[0], cmd.special, xdth, animatedgodmode, cmd.x, cmd.y, xOffset, yOffset, alpha);
break; break;
} }
case SBARINFO_DRAWSELECTEDINVENTORY: case SBARINFO_DRAWSELECTEDINVENTORY:
@ -719,11 +721,11 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
{ {
if((cmd.flags & DRAWSELECTEDINVENTORY_ARTIFLASH) && artiflash) if((cmd.flags & DRAWSELECTEDINVENTORY_ARTIFLASH) && artiflash)
{ {
DrawDimImage(Images[ARTIFLASH_OFFSET+(4-artiflash)], cmd.x, cmd.y, CPlayer->mo->InvSel->Amount <= 0); DrawGraphic(Images[ARTIFLASH_OFFSET+(4-artiflash)], cmd.x, cmd.y, xOffset, yOffset, alpha, false, CPlayer->mo->InvSel->Amount <= 0);
} }
else else
{ {
DrawDimImage(TexMan(CPlayer->mo->InvSel->Icon), cmd.x, cmd.y, CPlayer->mo->InvSel->Amount <= 0); DrawGraphic(TexMan(CPlayer->mo->InvSel->Icon), cmd.x, cmd.y, xOffset, yOffset, alpha, false, CPlayer->mo->InvSel->Amount <= 0);
} }
if((cmd.flags & DRAWSELECTEDINVENTORY_ALWAYSSHOWCOUNTER) || CPlayer->mo->InvSel->Amount != 1) if((cmd.flags & DRAWSELECTEDINVENTORY_ALWAYSSHOWCOUNTER) || CPlayer->mo->InvSel->Amount != 1)
{ {
@ -731,12 +733,12 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
{ {
drawingFont = cmd.font; drawingFont = cmd.font;
} }
DrawNumber(CPlayer->mo->InvSel->Amount, 3, cmd.special2, cmd.special3, cmd.translation, cmd.special4); DrawNumber(CPlayer->mo->InvSel->Amount, 3, cmd.special2, cmd.special3, xOffset, yOffset, alpha, cmd.translation, cmd.special4);
} }
} }
else if((cmd.flags & DRAWSELECTEDINVENTORY_ALTERNATEONEMPTY)) else if((cmd.flags & DRAWSELECTEDINVENTORY_ALTERNATEONEMPTY))
{ {
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
break; break;
case SBARINFO_DRAWINVENTORYBAR: case SBARINFO_DRAWINVENTORYBAR:
@ -757,7 +759,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
{ {
drawingFont = cmd.font; drawingFont = cmd.font;
} }
DrawInventoryBar(cmd.special, cmd.value, cmd.x, cmd.y, alwaysshow, cmd.special2, cmd.special3, cmd.translation, artibox, noarrows, alwaysshowcounter); DrawInventoryBar(cmd.special, cmd.value, cmd.x, cmd.y, xOffset, yOffset, alpha, alwaysshow, cmd.special2, cmd.special3, cmd.translation, artibox, noarrows, alwaysshowcounter);
break; break;
} }
case SBARINFO_DRAWBAR: case SBARINFO_DRAWBAR:
@ -905,8 +907,8 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
int cx, cy, cw, ch, cr, cb; int cx, cy, cw, ch, cr, cb;
// Calc real screen coordinates for bar // Calc real screen coordinates for bar
x = cmd.x + ST_X; x = cmd.x + ST_X + xOffset;
y = cmd.y + ST_Y; y = cmd.y + ST_Y + yOffset;
w = fg->GetScaledWidth(); w = fg->GetScaledWidth();
h = fg->GetScaledHeight(); h = fg->GetScaledHeight();
if (Scaled) if (Scaled)
@ -920,6 +922,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
screen->DrawTexture(fg, x, y, screen->DrawTexture(fg, x, y,
DTA_DestWidth, w, DTA_DestWidth, w,
DTA_DestHeight, h, DTA_DestHeight, h,
DTA_Alpha, alpha,
TAG_DONE); TAG_DONE);
} }
else else
@ -930,6 +933,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
screen->DrawTexture(bg, x, y, screen->DrawTexture(bg, x, y,
DTA_DestWidth, w, DTA_DestWidth, w,
DTA_DestHeight, h, DTA_DestHeight, h,
DTA_Alpha, alpha,
TAG_DONE); TAG_DONE);
} }
else else
@ -939,8 +943,8 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
} }
// Calc clipping rect for background // Calc clipping rect for background
cx = cmd.x + ST_X + cmd.special3; cx = cmd.x + ST_X + cmd.special3 + xOffset;
cy = cmd.y + ST_Y + cmd.special3; cy = cmd.y + ST_Y + cmd.special3 + yOffset;
cw = fg->GetScaledWidth() - fg->GetScaledLeftOffset() - cmd.special3 * 2; cw = fg->GetScaledWidth() - fg->GetScaledLeftOffset() - cmd.special3 * 2;
ch = fg->GetScaledHeight() - fg->GetScaledTopOffset() - cmd.special3 * 2; ch = fg->GetScaledHeight() - fg->GetScaledTopOffset() - cmd.special3 * 2;
if (Scaled) if (Scaled)
@ -987,6 +991,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
DTA_ClipTop, cy, DTA_ClipTop, cy,
DTA_ClipRight, cr, DTA_ClipRight, cr,
DTA_ClipBottom, cb, DTA_ClipBottom, cb,
DTA_Alpha, alpha,
TAG_DONE); TAG_DONE);
} }
else else
@ -1003,6 +1008,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
DTA_ClipTop, cy, DTA_ClipTop, cy,
DTA_ClipRight, cr, DTA_ClipRight, cr,
DTA_ClipBottom, cb, DTA_ClipBottom, cb,
DTA_Alpha, alpha,
TAG_DONE); TAG_DONE);
} }
break; break;
@ -1028,7 +1034,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
{ {
wiggle = !!(cmd.flags & DRAWGEM_WIGGLE); wiggle = !!(cmd.flags & DRAWGEM_WIGGLE);
} }
DrawGem(Images[cmd.special], Images[cmd.sprite], value, cmd.x, cmd.y, cmd.special2, cmd.special3, cmd.special4+1, wiggle, translate); DrawGem(Images[cmd.special], Images[cmd.sprite], value, cmd.x, cmd.y, xOffset, yOffset, alpha, cmd.special2, cmd.special3, cmd.special4+1, wiggle, translate);
break; break;
} }
case SBARINFO_DRAWSHADER: case SBARINFO_DRAWSHADER:
@ -1040,10 +1046,11 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
}; };
bool vertical = !!(cmd.flags & DRAWSHADER_VERTICAL); bool vertical = !!(cmd.flags & DRAWSHADER_VERTICAL);
bool reverse = !!(cmd.flags & DRAWSHADER_REVERSE); bool reverse = !!(cmd.flags & DRAWSHADER_REVERSE);
screen->DrawTexture (shaders[(vertical << 1) + reverse], ST_X+cmd.x, ST_Y+cmd.y, screen->DrawTexture (shaders[(vertical << 1) + reverse], ST_X+cmd.x+xOffset, ST_Y+cmd.y+yOffset,
DTA_DestWidth, cmd.special, DTA_DestWidth, cmd.special,
DTA_DestHeight, cmd.special2, DTA_DestHeight, cmd.special2,
DTA_Bottom320x200, Scaled, DTA_Bottom320x200, Scaled,
DTA_Alpha, alpha,
DTA_AlphaChannel, true, DTA_AlphaChannel, true,
DTA_FillColor, 0, DTA_FillColor, 0,
TAG_DONE); TAG_DONE);
@ -1054,7 +1061,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
{ {
drawingFont = cmd.font; drawingFont = cmd.font;
} }
DrawString(cmd.string[0], cmd.x - drawingFont->StringWidth(cmd.string[0]), cmd.y, cmd.translation, cmd.special); DrawString(cmd.string[0], cmd.x - drawingFont->StringWidth(cmd.string[0]), cmd.y, xOffset, yOffset, alpha, cmd.translation, cmd.special);
break; break;
case SBARINFO_DRAWKEYBAR: case SBARINFO_DRAWKEYBAR:
{ {
@ -1071,9 +1078,9 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
goto FinishDrawKeyBar; goto FinishDrawKeyBar;
} }
if(!vertical) if(!vertical)
DrawImage(TexMan[item->Icon], cmd.x+(cmd.special*i), cmd.y); DrawGraphic(TexMan[item->Icon], cmd.x+(cmd.special*i), cmd.y, xOffset, yOffset, alpha);
else else
DrawImage(TexMan[item->Icon], cmd.x, cmd.y+(cmd.special*i)); DrawGraphic(TexMan[item->Icon], cmd.x, cmd.y+(cmd.special*i), xOffset, yOffset, alpha);
item = item->Inventory; item = item->Inventory;
if(item == NULL) if(item == NULL)
break; break;
@ -1087,7 +1094,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
((cmd.flags & GAMETYPE_COOPERATIVE) && multiplayer && !deathmatch) || ((cmd.flags & GAMETYPE_COOPERATIVE) && multiplayer && !deathmatch) ||
((cmd.flags & GAMETYPE_TEAMGAME) && teamplay)) ((cmd.flags & GAMETYPE_TEAMGAME) && teamplay))
{ {
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
break; break;
case SBARINFO_PLAYERCLASS: case SBARINFO_PLAYERCLASS:
@ -1096,14 +1103,14 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
int spawnClass = CPlayer->cls->ClassIndex; int spawnClass = CPlayer->cls->ClassIndex;
if(cmd.special == spawnClass || cmd.special2 == spawnClass || cmd.special3 == spawnClass) if(cmd.special == spawnClass || cmd.special2 == spawnClass || cmd.special3 == spawnClass)
{ {
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
break; break;
} }
case SBARINFO_ASPECTRATIO: case SBARINFO_ASPECTRATIO:
if(CheckRatio(screen->GetWidth(), screen->GetHeight()) == cmd.value) if(CheckRatio(screen->GetWidth(), screen->GetHeight()) == cmd.value)
{ {
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
break; break;
case SBARINFO_ISSELECTED: case SBARINFO_ISSELECTED:
@ -1114,16 +1121,16 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
if(weapon2 != NULL) if(weapon2 != NULL)
{ {
if((cmd.flags & SBARINFOEVENT_NOT) && (weapon1 != CPlayer->ReadyWeapon->GetSpecies() && weapon2 != CPlayer->ReadyWeapon->GetSpecies())) if((cmd.flags & SBARINFOEVENT_NOT) && (weapon1 != CPlayer->ReadyWeapon->GetSpecies() && weapon2 != CPlayer->ReadyWeapon->GetSpecies()))
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
else if(!(cmd.flags & SBARINFOEVENT_NOT) && (weapon1 == CPlayer->ReadyWeapon->GetSpecies() || weapon2 == CPlayer->ReadyWeapon->GetSpecies())) else if(!(cmd.flags & SBARINFOEVENT_NOT) && (weapon1 == CPlayer->ReadyWeapon->GetSpecies() || weapon2 == CPlayer->ReadyWeapon->GetSpecies()))
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
else else
{ {
if(!(cmd.flags & SBARINFOEVENT_NOT) && weapon1 == CPlayer->ReadyWeapon->GetSpecies()) if(!(cmd.flags & SBARINFOEVENT_NOT) && weapon1 == CPlayer->ReadyWeapon->GetSpecies())
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
else if((cmd.flags & SBARINFOEVENT_NOT) && weapon1 != CPlayer->ReadyWeapon->GetSpecies()) else if((cmd.flags & SBARINFOEVENT_NOT) && weapon1 != CPlayer->ReadyWeapon->GetSpecies())
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
} }
break; break;
@ -1150,11 +1157,11 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
if(((cmd.flags & SBARINFOEVENT_OR) && (match1 || match2)) || ((cmd.flags & SBARINFOEVENT_AND) && (match1 && match2))) if(((cmd.flags & SBARINFOEVENT_OR) && (match1 || match2)) || ((cmd.flags & SBARINFOEVENT_AND) && (match1 && match2)))
{ {
if(!(cmd.flags & SBARINFOEVENT_NOT)) if(!(cmd.flags & SBARINFOEVENT_NOT))
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
else if(cmd.flags & SBARINFOEVENT_NOT) else if(cmd.flags & SBARINFOEVENT_NOT)
{ {
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
} }
else //Every thing here could probably be one long if statement but then it would be more confusing. else //Every thing here could probably be one long if statement but then it would be more confusing.
@ -1162,11 +1169,11 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
if((usesammo1 && (AmmoType1 == IfAmmo1)) || (usesammo2 && (AmmoType2 == IfAmmo1))) if((usesammo1 && (AmmoType1 == IfAmmo1)) || (usesammo2 && (AmmoType2 == IfAmmo1)))
{ {
if(!(cmd.flags & SBARINFOEVENT_NOT)) if(!(cmd.flags & SBARINFOEVENT_NOT))
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
else if(cmd.flags & SBARINFOEVENT_NOT) else if(cmd.flags & SBARINFOEVENT_NOT)
{ {
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
} }
} }
@ -1178,66 +1185,57 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset)
if(cmd.flags & SBARINFOEVENT_AND) if(cmd.flags & SBARINFOEVENT_AND)
{ {
if((item1 != NULL && item2 != NULL) && !(cmd.flags & SBARINFOEVENT_NOT)) if((item1 != NULL && item2 != NULL) && !(cmd.flags & SBARINFOEVENT_NOT))
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
else if((item1 == NULL || item2 == NULL) && (cmd.flags & SBARINFOEVENT_NOT)) else if((item1 == NULL || item2 == NULL) && (cmd.flags & SBARINFOEVENT_NOT))
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
else if(cmd.flags & SBARINFOEVENT_OR) else if(cmd.flags & SBARINFOEVENT_OR)
{ {
if((item1 != NULL || item2 != NULL) && !(cmd.flags & SBARINFOEVENT_NOT)) if((item1 != NULL || item2 != NULL) && !(cmd.flags & SBARINFOEVENT_NOT))
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
else if((item1 == NULL && item2 == NULL) && (cmd.flags & SBARINFOEVENT_NOT)) else if((item1 == NULL && item2 == NULL) && (cmd.flags & SBARINFOEVENT_NOT))
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
} }
else if((item1 != NULL) && !(cmd.flags & SBARINFOEVENT_NOT)) else if((item1 != NULL) && !(cmd.flags & SBARINFOEVENT_NOT))
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
else if((item1 == NULL) && (cmd.flags & SBARINFOEVENT_NOT)) else if((item1 == NULL) && (cmd.flags & SBARINFOEVENT_NOT))
doCommands(cmd.subBlock, xOffset, yOffset); doCommands(cmd.subBlock, xOffset, yOffset, alpha);
break; break;
} }
} }
cmd.x -= xOffset;
cmd.y -= yOffset;
} }
} }
//draws an image with the specified flags //draws an image with the specified flags
void DSBarInfo::DrawGraphic(FTexture* texture, int x, int y, int flags) void DSBarInfo::DrawGraphic(FTexture* texture, int x, int y, int xOffset, int yOffset, int alpha,
bool translate, bool dim, bool center) //flags
{ {
if (texture == NULL) if (texture == NULL)
{
return; return;
}
if((flags & DRAWIMAGE_OFFSET_CENTER)) if(center)
{ {
x -= (texture->GetWidth()/2)-texture->LeftOffset; x -= (texture->GetWidth()/2)-texture->LeftOffset;
y -= (texture->GetHeight()/2)-texture->TopOffset; y -= (texture->GetHeight()/2)-texture->TopOffset;
} }
x += ST_X;
y += ST_Y; x += ST_X + xOffset;
y += ST_Y + yOffset;
int w = texture->GetScaledWidth(); int w = texture->GetScaledWidth();
int h = texture->GetScaledHeight() + y; int h = texture->GetScaledHeight() + y;
if(Scaled) if(Scaled)
screen->VirtualToRealCoordsInt(x, y, w, h, 320, 200, true); screen->VirtualToRealCoordsInt(x, y, w, h, 320, 200, true);
h -= y; h -= y;
if((flags & DRAWIMAGE_TRANSLATABLE)) screen->DrawTexture(texture, x, y,
{ DTA_DestWidth, w,
screen->DrawTexture(texture, x, y, DTA_DestHeight, h,
DTA_DestWidth, w, DTA_Translation, translate ? getTranslation() : 0,
DTA_DestHeight, h, DTA_ColorOverlay, dim ? DIM_OVERLAY : 0,
DTA_Translation, getTranslation(), DTA_Alpha, alpha,
TAG_DONE); TAG_DONE);
}
else
{
screen->DrawTexture(texture, x, y,
DTA_DestWidth, w,
DTA_DestHeight, h,
TAG_DONE);
}
} }
void DSBarInfo::DrawString(const char* str, int x, int y, EColorRange translation, int spacing) void DSBarInfo::DrawString(const char* str, int x, int y, int xOffset, int yOffset, int alpha, EColorRange translation, int spacing)
{ {
x += spacing; x += spacing;
while(*str != '\0') while(*str != '\0')
@ -1261,8 +1259,8 @@ void DSBarInfo::DrawString(const char* str, int x, int y, EColorRange translatio
} }
if(SBarInfoScript->spacingCharacter == '\0') //If we are monospaced lets use the offset if(SBarInfoScript->spacingCharacter == '\0') //If we are monospaced lets use the offset
x += (character->LeftOffset+1); //ignore x offsets since we adapt to character size x += (character->LeftOffset+1); //ignore x offsets since we adapt to character size
int rx = x + ST_X; int rx = x + ST_X + xOffset;
int ry = y + ST_Y; int ry = y + ST_Y + yOffset;
int rw = character->GetScaledWidth(); int rw = character->GetScaledWidth();
int rh = character->GetScaledHeight(); int rh = character->GetScaledHeight();
if(Scaled) if(Scaled)
@ -1271,6 +1269,7 @@ void DSBarInfo::DrawString(const char* str, int x, int y, EColorRange translatio
DTA_DestWidth, rw, DTA_DestWidth, rw,
DTA_DestHeight, rh, DTA_DestHeight, rh,
DTA_Translation, drawingFont->GetColorTranslation(translation), DTA_Translation, drawingFont->GetColorTranslation(translation),
DTA_Alpha, alpha,
TAG_DONE); TAG_DONE);
if(SBarInfoScript->spacingCharacter == '\0') if(SBarInfoScript->spacingCharacter == '\0')
x += width + spacing - (character->LeftOffset+1); x += width + spacing - (character->LeftOffset+1);
@ -1281,7 +1280,7 @@ void DSBarInfo::DrawString(const char* str, int x, int y, EColorRange translatio
} }
//draws the specified number up to len digits //draws the specified number up to len digits
void DSBarInfo::DrawNumber(int num, int len, int x, int y, EColorRange translation, int spacing, bool fillzeros) void DSBarInfo::DrawNumber(int num, int len, int x, int y, int xOffset, int yOffset, int alpha, EColorRange translation, int spacing, bool fillzeros)
{ {
FString value; FString value;
int maxval = (int) ceil(pow(10., len))-1; int maxval = (int) ceil(pow(10., len))-1;
@ -1306,11 +1305,11 @@ void DSBarInfo::DrawNumber(int num, int len, int x, int y, EColorRange translati
x -= int(drawingFont->StringWidth(value)+(spacing * value.Len())); x -= int(drawingFont->StringWidth(value)+(spacing * value.Len()));
else //monospaced so just multiplay the character size else //monospaced so just multiplay the character size
x -= int((drawingFont->GetCharWidth((int) SBarInfoScript->spacingCharacter) + spacing) * value.Len()); x -= int((drawingFont->GetCharWidth((int) SBarInfoScript->spacingCharacter) + spacing) * value.Len());
DrawString(value, x, y, translation, spacing); DrawString(value, x, y, xOffset, yOffset, alpha, translation, spacing);
} }
//draws the mug shot //draws the mug shot
void DSBarInfo::DrawFace(FString &defaultFace, int accuracy, bool xdth, bool animatedgodmode, int x, int y) void DSBarInfo::DrawFace(FString &defaultFace, int accuracy, bool xdth, bool animatedgodmode, int x, int y, int xOffset, int yOffset, int alpha)
{ {
int angle = updateState(xdth, animatedgodmode); int angle = updateState(xdth, animatedgodmode);
int level = 0; int level = 0;
@ -1320,18 +1319,7 @@ void DSBarInfo::DrawFace(FString &defaultFace, int accuracy, bool xdth, bool ani
FPlayerSkin *skin = &skins[CPlayer->morphTics ? CPlayer->MorphedPlayerClass : CPlayer->userinfo.skin]; FPlayerSkin *skin = &skins[CPlayer->morphTics ? CPlayer->MorphedPlayerClass : CPlayer->userinfo.skin];
FTexture *face = currentState->getCurrentFrameTexture(defaultFace, skin, level, angle); FTexture *face = currentState->getCurrentFrameTexture(defaultFace, skin, level, angle);
if (face != NULL) if (face != NULL)
{ DrawGraphic(face, x, y, xOffset, yOffset, alpha);
x += ST_X;
y += ST_Y;
int w = face->GetScaledWidth();
int h = face->GetScaledHeight();
if(Scaled)
screen->VirtualToRealCoordsInt(x, y, w, h, 320, 200, true);
screen->DrawTexture(face, x, y,
DTA_DestWidth, w,
DTA_DestHeight, h,
TAG_DONE);
}
} }
} }
@ -1454,7 +1442,7 @@ int DSBarInfo::updateState(bool xdth, bool animatedgodmode)
return 0; return 0;
} }
void DSBarInfo::DrawInventoryBar(int type, int num, int x, int y, bool alwaysshow, void DSBarInfo::DrawInventoryBar(int type, int num, int x, int y, int xOffset, int yOffset, int alpha, bool alwaysshow,
int counterx, int countery, EColorRange translation, bool drawArtiboxes, bool noArrows, bool alwaysshowcounter) int counterx, int countery, EColorRange translation, bool drawArtiboxes, bool noArrows, bool alwaysshowcounter)
{ //yes, there is some Copy & Paste here too { //yes, there is some Copy & Paste here too
AInventory *item; AInventory *item;
@ -1468,46 +1456,46 @@ void DSBarInfo::DrawInventoryBar(int type, int num, int x, int y, bool alwayssho
{ {
if(drawArtiboxes) if(drawArtiboxes)
{ {
DrawGraphic(Images[invBarOffset + imgARTIBOX], x+i*31, y); DrawGraphic(Images[invBarOffset + imgARTIBOX], x+i*31, y, xOffset, yOffset, alpha);
} }
DrawDimImage (TexMan(item->Icon), x+i*31, y, item->Amount <= 0); DrawGraphic(TexMan(item->Icon), x+i*31, y, xOffset, yOffset, alpha, false, item->Amount <= 0);
if(alwaysshowcounter || item->Amount != 1) if(alwaysshowcounter || item->Amount != 1)
{ {
DrawNumber(item->Amount, 3, counterx+i*31, countery, translation); DrawNumber(item->Amount, 3, counterx+i*31, countery, xOffset, yOffset, alpha, translation);
} }
if(item == CPlayer->mo->InvSel) if(item == CPlayer->mo->InvSel)
{ {
if(type == GAME_Heretic) if(type == GAME_Heretic)
{ {
DrawGraphic(Images[invBarOffset + imgSELECTBOX], x+i*31, y+29); DrawGraphic(Images[invBarOffset + imgSELECTBOX], x+i*31, y+29, xOffset, yOffset, alpha);
} }
else else
{ {
DrawGraphic(Images[invBarOffset + imgSELECTBOX], x+i*31, y); DrawGraphic(Images[invBarOffset + imgSELECTBOX], x+i*31, y, xOffset, yOffset, alpha);
} }
} }
} }
for (; i < num && drawArtiboxes; ++i) for (; i < num && drawArtiboxes; ++i)
{ {
DrawGraphic(Images[invBarOffset + imgARTIBOX], x+i*31, y); DrawGraphic(Images[invBarOffset + imgARTIBOX], x+i*31, y, xOffset, yOffset, alpha);
} }
// Is there something to the left? // Is there something to the left?
if (!noArrows && CPlayer->mo->FirstInv() != CPlayer->mo->InvFirst) if (!noArrows && CPlayer->mo->FirstInv() != CPlayer->mo->InvFirst)
{ {
DrawGraphic(Images[!(gametic & 4) ? DrawGraphic(Images[!(gametic & 4) ?
invBarOffset + imgINVLFGEM1 : invBarOffset + imgINVLFGEM2], x-12, y); invBarOffset + imgINVLFGEM1 : invBarOffset + imgINVLFGEM2], x-12, y, xOffset, yOffset, alpha);
} }
// Is there something to the right? // Is there something to the right?
if (!noArrows && item != NULL) if (!noArrows && item != NULL)
{ {
DrawGraphic(Images[!(gametic & 4) ? DrawGraphic(Images[!(gametic & 4) ?
invBarOffset + imgINVRTGEM1 : invBarOffset + imgINVRTGEM2], x+num*31+2, y); invBarOffset + imgINVRTGEM1 : invBarOffset + imgINVRTGEM2], x+num*31+2, y, xOffset, yOffset, alpha);
} }
} }
} }
//draws heretic/hexen style life gems //draws heretic/hexen style life gems
void DSBarInfo::DrawGem(FTexture* chain, FTexture* gem, int value, int x, int y, int padleft, int padright, int chainsize, void DSBarInfo::DrawGem(FTexture* chain, FTexture* gem, int value, int x, int y, int xOffset, int yOffset, int alpha, int padleft, int padright, int chainsize,
bool wiggle, bool translate) bool wiggle, bool translate)
{ {
if(chain == NULL) if(chain == NULL)

View file

@ -255,18 +255,25 @@ void SBarInfo::ParseSBarInfo(int lump)
barNum = sc.MustMatchString(StatusBars); barNum = sc.MustMatchString(StatusBars);
} }
this->huds[barNum] = SBarInfoBlock(); this->huds[barNum] = SBarInfoBlock();
while(sc.CheckToken(',')) if(sc.CheckToken(','))
{ {
sc.MustGetToken(TK_Identifier); while(sc.CheckToken(TK_Identifier))
if(sc.Compare("forcescaled"))
{ {
this->huds[barNum].forceScaled = true; if(sc.Compare("forcescaled"))
} {
else this->huds[barNum].forceScaled = true;
{ }
sc.ScriptError("Unkown flag '%s'.", sc.String); else
{
sc.ScriptError("Unkown flag '%s'.", sc.String);
}
if(!sc.CheckToken('|') || !sc.CheckToken(','))
goto FinishStatusBar; //No more args so we must skip over anything else and go to the end.
} }
sc.MustGetToken(TK_FloatConst);
this->huds[barNum].alpha = FRACUNIT * sc.Float;
} }
FinishStatusBar:
sc.MustGetToken('{'); sc.MustGetToken('{');
if(barNum == STBAR_AUTOMAP) if(barNum == STBAR_AUTOMAP)
{ {
@ -336,6 +343,16 @@ void SBarInfo::ParseSBarInfo(int lump)
sc.MustGetToken(TK_IntConst); sc.MustGetToken(TK_IntConst);
popup.speed = sc.Number; popup.speed = sc.Number;
} }
else if(sc.Compare("fade"))
{
popup.transition = TRANSITION_FADE;
sc.MustGetToken(',');
sc.MustGetToken(TK_FloatConst);
popup.speed = FRACUNIT * sc.Float;
sc.MustGetToken(',');
sc.MustGetToken(TK_FloatConst);
popup.speed2 = FRACUNIT * sc.Float;
}
else else
sc.ScriptError("Unkown transition type: '%s'", sc.String); sc.ScriptError("Unkown transition type: '%s'", sc.String);
} }
@ -1264,6 +1281,7 @@ SBarInfoCommand::~SBarInfoCommand()
SBarInfoBlock::SBarInfoBlock() SBarInfoBlock::SBarInfoBlock()
{ {
forceScaled = false; forceScaled = false;
alpha = FRACUNIT;
} }
const MugShotState *FindMugShotState(FString state) const MugShotState *FindMugShotState(FString state)
@ -1286,6 +1304,7 @@ Popup::Popup()
speed = 0; speed = 0;
x = 320; x = 320;
y = 200; y = 200;
alpha = FRACUNIT;
opened = false; opened = false;
moving = false; moving = false;
} }
@ -1298,6 +1317,12 @@ void Popup::init()
{ {
x = 0; x = 0;
} }
else if(transition == TRANSITION_FADE)
{
alpha = 0;
x = 0;
y = 0;
}
} }
void Popup::tick() void Popup::tick()
@ -1316,9 +1341,22 @@ void Popup::tick()
else else
moving = false; moving = false;
} }
else if(transition == TRANSITION_FADE)
{
if(moving)
{
if(opened)
alpha = clamp(alpha + speed, 0, FRACUNIT);
else
alpha = clamp(alpha - speed2, 0, FRACUNIT);
}
if(alpha == 0 || alpha == FRACUNIT)
moving = false;
else
moving = true;
}
else else
{ {
moving = false;
if(opened) if(opened)
{ {
y = 0; y = 0;
@ -1329,6 +1367,7 @@ void Popup::tick()
y = height; y = height;
x = width; x = width;
} }
moving = false;
} }
} }
@ -1347,6 +1386,13 @@ int Popup::getYOffset()
return y; return y;
} }
int Popup::getAlpha(int maxAlpha)
{
double a = (double) alpha / (double) FRACUNIT;
double b = (double) maxAlpha / (double) FRACUNIT;
return fixed_t((a * b) * FRACUNIT);
}
void Popup::open() void Popup::open()
{ {
opened = true; opened = true;

View file

@ -989,15 +989,14 @@ void FMultiPatchTexture::ParsePatch(FScanner &sc, TexPart & part)
{ {
int r,g,b; int r,g,b;
sc.MustGetNumber();
sc.MustGetStringName(",");
r = sc.Number; r = sc.Number;
sc.MustGetNumber();
sc.MustGetStringName(","); sc.MustGetStringName(",");
sc.MustGetNumber();
g = sc.Number; g = sc.Number;
sc.MustGetNumber();
sc.MustGetStringName(","); sc.MustGetStringName(",");
sc.MustGetNumber();
b = sc.Number; b = sc.Number;
sc.MustGetStringName(",");
part.Blend = MAKERGB(r, g, b); part.Blend = MAKERGB(r, g, b);
} }
if (sc.CheckString(",")) if (sc.CheckString(","))