Better vertical bars and new orders prepared.
This commit is contained in:
parent
88fdad5fd8
commit
2ff489338a
1 changed files with 241 additions and 65 deletions
|
@ -60,6 +60,10 @@ global int ShowHealthHorizontal=1;
|
|||
global int ShowManaHorizontal=1;
|
||||
/// Flag: show bars and dot energy only for selected
|
||||
global int ShowEnergySelectedOnly;
|
||||
/// Flag: show health bar always full sized
|
||||
global int ShowFullSizedHealthBar=1;
|
||||
/// Flag: show mana bar always full sized
|
||||
global int ShowFullSizedManaBar=1;
|
||||
|
||||
// FIXME: not all variables of this file are here
|
||||
// FIXME: perhaps split this file into two?
|
||||
|
@ -344,6 +348,8 @@ local void DrawDecoration(Unit* unit,const UnitType* type,int x,int y)
|
|||
{
|
||||
int f;
|
||||
int color;
|
||||
int deco_x;
|
||||
int deco_y;
|
||||
UnitStats* stats;
|
||||
|
||||
|
||||
|
@ -354,8 +360,10 @@ local void DrawDecoration(Unit* unit,const UnitType* type,int x,int y)
|
|||
return;
|
||||
}
|
||||
|
||||
// FIXME: Should split this into small functions?
|
||||
|
||||
//
|
||||
// Health bar on left side of unit.
|
||||
// Health bar of the unit.
|
||||
//
|
||||
stats=unit->Stats;
|
||||
if( ShowHealthBar ) {
|
||||
|
@ -369,26 +377,31 @@ local void DrawDecoration(Unit* unit,const UnitType* type,int x,int y)
|
|||
} else {
|
||||
color=ColorRed;
|
||||
}
|
||||
if ( ShowHealthHorizontal == 0) {
|
||||
VideoFillRectangleClip(color
|
||||
,x+(type->TileWidth*TileSizeX
|
||||
-type->BoxWidth)/2
|
||||
,y+(type->TileHeight*TileSizeY
|
||||
-type->BoxHeight)/2
|
||||
,2,(f*type->BoxHeight)/100);
|
||||
} else {
|
||||
if( ShowHealthHorizontal ) {
|
||||
deco_x=x+((type->TileWidth*TileSizeX-type->BoxWidth)/2)-1;
|
||||
deco_y=y+(type->TileHeight*TileSizeY-type->BoxHeight)/2
|
||||
+type->BoxHeight;
|
||||
if( !ShowFullSizedHealthBar ) {
|
||||
VideoFillRectangleClip(ColorBlack
|
||||
,x+((type->TileWidth*TileSizeX-type->BoxWidth)/2)-1
|
||||
,(y+(type->TileHeight*TileSizeY-type->BoxHeight)/2)
|
||||
+type->BoxHeight+1
|
||||
,((f*type->BoxHeight)/100)+2
|
||||
,5);
|
||||
VideoFillRectangleClip(color
|
||||
,x+((type->TileWidth*TileSizeX-type->BoxWidth)/2)
|
||||
,(y+(type->TileHeight*TileSizeY-type->BoxHeight)/2)
|
||||
+type->BoxHeight+2
|
||||
,(f*type->BoxHeight)/100
|
||||
,3);
|
||||
,deco_x,deco_y,type->BoxWidth+2,4);
|
||||
} else {
|
||||
VideoDrawRectangleClip(ColorBlack
|
||||
,deco_x,deco_y,(f*type->BoxWidth)/100+1,3);
|
||||
}
|
||||
VideoFillRectangleClip(color
|
||||
,deco_x+1,deco_y+1,(f*type->BoxWidth)/100,2);
|
||||
} else {
|
||||
deco_x=x+(type->TileWidth*TileSizeX-type->BoxWidth)/2-3;
|
||||
deco_y=y+(type->TileHeight*TileSizeY-type->BoxHeight)/2;
|
||||
if( ShowFullSizedHealthBar ) {
|
||||
VideoFillRectangleClip(ColorBlack
|
||||
,deco_x,deco_y,4,type->BoxHeight+1);
|
||||
} else {
|
||||
VideoDrawRectangleClip(ColorBlack
|
||||
,deco_x,deco_y,3,(f*type->BoxHeight)/100);
|
||||
}
|
||||
VideoFillRectangleClip(color
|
||||
,deco_x+1,deco_y+1,2,(f*type->BoxHeight)/100-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -399,8 +412,6 @@ local void DrawDecoration(Unit* unit,const UnitType* type,int x,int y)
|
|||
if( ShowHealthDot ) {
|
||||
if( stats->HitPoints
|
||||
&& !(ShowNoFull && unit->HP==stats->HitPoints) ) {
|
||||
int x1;
|
||||
int y1;
|
||||
int n;
|
||||
|
||||
f=(100*unit->HP)/stats->HitPoints;
|
||||
|
@ -415,55 +426,61 @@ local void DrawDecoration(Unit* unit,const UnitType* type,int x,int y)
|
|||
}
|
||||
DebugCheck( n<0 );
|
||||
if( HealthSprite.HotX<0 ) {
|
||||
x1=x+HealthSprite.HotX
|
||||
deco_x=x+HealthSprite.HotX
|
||||
+(type->TileWidth*TileSizeX
|
||||
+type->BoxWidth+1)/2;
|
||||
} else {
|
||||
x1=x-HealthSprite.HotX
|
||||
deco_x=x-HealthSprite.HotX
|
||||
+(type->TileWidth*TileSizeX
|
||||
-type->BoxWidth+1)/2;
|
||||
}
|
||||
if( HealthSprite.HotY<0 ) {
|
||||
y1=y+HealthSprite.HotY
|
||||
deco_y=y+HealthSprite.HotY
|
||||
+(type->TileHeight*TileSizeY
|
||||
+type->BoxHeight+1)/2;
|
||||
} else {
|
||||
y1=y-HealthSprite.HotY
|
||||
deco_y=y-HealthSprite.HotY
|
||||
+(type->TileHeight*TileSizeY
|
||||
-type->BoxHeight+1)/2;
|
||||
}
|
||||
VideoDrawClip(HealthSprite.Sprite,n,x1,y1);
|
||||
VideoDrawClip(HealthSprite.Sprite,n,deco_x,deco_y);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Mana bar on right side of unit.
|
||||
// Mana bar for the unit.
|
||||
//
|
||||
if( ShowManaBar ) {
|
||||
if( type->CanCastSpell
|
||||
&& !(ShowNoFull && unit->Mana==255) ) {
|
||||
if ( ShowManaHorizontal == 0) {
|
||||
f=(100*unit->Mana)/255;
|
||||
VideoFillRectangleClip(ColorBlue
|
||||
,x+(type->TileWidth*TileSizeX
|
||||
+type->BoxWidth)/2
|
||||
,y+(type->TileHeight*TileSizeY
|
||||
-type->BoxHeight)/2
|
||||
,2,(f*type->BoxHeight)/100);
|
||||
} else {
|
||||
f=(100*unit->Mana)/255;
|
||||
if( ShowManaHorizontal ) {
|
||||
f=(100*unit->Mana)/255;
|
||||
deco_x=x+((type->TileWidth*TileSizeX-type->BoxWidth)/2)-1;
|
||||
deco_y=y+(type->TileHeight*TileSizeY-type->BoxHeight)/2
|
||||
+type->BoxHeight+4;
|
||||
if( ShowFullSizedManaBar ) {
|
||||
VideoFillRectangleClip(ColorBlack
|
||||
,x+((type->TileWidth*TileSizeX-type->BoxWidth)/2)-1
|
||||
,(y+(type->TileHeight*TileSizeY-type->BoxHeight)/2)+type->BoxHeight+6
|
||||
,(type->BoxHeight)+2
|
||||
,5);
|
||||
VideoFillRectangleClip(ColorBlue
|
||||
,x+(type->TileWidth*TileSizeX-type->BoxWidth)/2
|
||||
,(y+(type->TileHeight*TileSizeY-type->BoxHeight)/2)+type->BoxHeight+7
|
||||
,(f*type->BoxHeight)/100
|
||||
,3);
|
||||
,deco_x,deco_y,type->BoxHeight+2,4);
|
||||
} else {
|
||||
VideoDrawRectangleClip(ColorBlack
|
||||
,deco_x,deco_y,(f*type->BoxHeight)/100+1,3);
|
||||
}
|
||||
VideoFillRectangleClip(ColorBlue
|
||||
,deco_x+1,deco_y+1,(f*type->BoxHeight)/100,2);
|
||||
} else {
|
||||
deco_x=x+(type->TileWidth*TileSizeX+type->BoxWidth)/2;
|
||||
deco_y=y+(type->TileHeight*TileSizeY-type->BoxHeight)/2;
|
||||
f=(100*unit->Mana)/255;
|
||||
if( ShowFullSizedManaBar ) {
|
||||
VideoFillRectangleClip(ColorBlack
|
||||
,deco_x,deco_y,4,type->BoxHeight+1);
|
||||
} else {
|
||||
VideoDrawRectangleClip(ColorBlack
|
||||
,deco_x,deco_y,3,(f*type->BoxHeight)/100);
|
||||
}
|
||||
VideoFillRectangleClip(ColorBlue
|
||||
,deco_x+1,deco_y+1,2,(f*type->BoxHeight)/100-1);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -473,8 +490,6 @@ local void DrawDecoration(Unit* unit,const UnitType* type,int x,int y)
|
|||
if( ShowManaDot ) {
|
||||
if( type->CanCastSpell
|
||||
&& !(ShowNoFull && unit->Mana==255) ) {
|
||||
int x1;
|
||||
int y1;
|
||||
int n;
|
||||
|
||||
f=(100*unit->Mana)/255;
|
||||
|
@ -492,24 +507,24 @@ local void DrawDecoration(Unit* unit,const UnitType* type,int x,int y)
|
|||
n=4;
|
||||
}
|
||||
if( ManaSprite.HotX<0 ) {
|
||||
x1=x+ManaSprite.HotX
|
||||
deco_x=x+ManaSprite.HotX
|
||||
+(type->TileWidth*TileSizeX
|
||||
+type->BoxWidth+1)/2;
|
||||
} else {
|
||||
x1=x-ManaSprite.HotX
|
||||
deco_x=x-ManaSprite.HotX
|
||||
+(type->TileWidth*TileSizeX
|
||||
-type->BoxWidth+1)/2;
|
||||
}
|
||||
if( ManaSprite.HotY<0 ) {
|
||||
y1=y+ManaSprite.HotY
|
||||
deco_y=y+ManaSprite.HotY
|
||||
+(type->TileHeight*TileSizeY
|
||||
+type->BoxHeight+1)/2;
|
||||
} else {
|
||||
y1=y-ManaSprite.HotY
|
||||
deco_y=y-ManaSprite.HotY
|
||||
+(type->TileHeight*TileSizeY
|
||||
-type->BoxHeight+1)/2;
|
||||
}
|
||||
VideoDrawClip(ManaSprite.Sprite,n,x1,y1);
|
||||
VideoDrawClip(ManaSprite.Sprite,n,deco_x,deco_y);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -544,6 +559,7 @@ local void DrawShadow(Unit* unit,UnitType* type,int x,int y)
|
|||
,x+ShadowSprite.HotX,y+ShadowSprite.HotY);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/**
|
||||
** Draw path from current postion to the destination of the move.
|
||||
**
|
||||
|
@ -665,15 +681,134 @@ global void DrawPath(Unit* unit)
|
|||
,6,6);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
** Show the current order of an unit.
|
||||
**
|
||||
** @param unit Pointer to the unit.
|
||||
**
|
||||
*/
|
||||
local void ShowOrder(const Unit* unit)
|
||||
{
|
||||
#ifdef NEW_ORDERS
|
||||
int x1;
|
||||
int y1;
|
||||
int x2;
|
||||
int y2;
|
||||
int color;
|
||||
const Unit* goal;
|
||||
int i;
|
||||
|
||||
if( unit->Destroyed ) {
|
||||
return;
|
||||
}
|
||||
x1=Map2ScreenX(unit->X)+unit->IX+unit->Type->TileWidth*TileSizeX/2;
|
||||
y1=Map2ScreenY(unit->Y)+unit->IY+unit->Type->TileHeight*TileSizeY/2;
|
||||
VideoFillCircleClip(ColorGreen,x1,y1,1);
|
||||
|
||||
for( i=0; i<=unit->OrderCount; ++i ) {
|
||||
if( (goal=unit->Orders[i].Goal) ) {
|
||||
x2=Map2ScreenX(goal->X)+goal->IX+goal->Type->TileWidth*TileSizeX/2;
|
||||
y2=Map2ScreenY(goal->Y)+goal->IY+goal->Type->TileHeight*TileSizeY/2;
|
||||
} else {
|
||||
x2=Map2ScreenX(unit->Orders[i].X)+TileSizeX/2;
|
||||
y2=Map2ScreenY(unit->Orders[i].Y)+TileSizeY/2;
|
||||
}
|
||||
switch( unit->Orders[i].Action ) {
|
||||
case UnitActionNone:
|
||||
color=ColorGray;
|
||||
break;
|
||||
|
||||
case UnitActionStill:
|
||||
color=ColorGray;
|
||||
break;
|
||||
|
||||
case UnitActionStandGround:
|
||||
color=ColorGray;
|
||||
break;
|
||||
|
||||
case UnitActionFollow:
|
||||
case UnitActionMove:
|
||||
color=ColorGreen;
|
||||
break;
|
||||
|
||||
case UnitActionPatrol:
|
||||
VideoDrawLineClip(ColorGreen,x1,y1,x2,y2);
|
||||
color=ColorBlue;
|
||||
break;
|
||||
|
||||
case UnitActionRepair:
|
||||
color=ColorGreen;
|
||||
break;
|
||||
|
||||
case UnitActionAttack:
|
||||
case UnitActionAttackGround:
|
||||
color=ColorRed;
|
||||
break;
|
||||
|
||||
case UnitActionBoard:
|
||||
color=ColorGreen;
|
||||
break;
|
||||
|
||||
case UnitActionUnload:
|
||||
color=ColorGreen;
|
||||
break;
|
||||
|
||||
case UnitActionDie:
|
||||
color=ColorGray;
|
||||
break;
|
||||
|
||||
case UnitActionTrain:
|
||||
color=ColorGray;
|
||||
break;
|
||||
|
||||
case UnitActionUpgradeTo:
|
||||
color=ColorGray;
|
||||
break;
|
||||
|
||||
case UnitActionResearch:
|
||||
color=ColorGray;
|
||||
break;
|
||||
|
||||
case UnitActionBuild:
|
||||
color=ColorGreen;
|
||||
break;
|
||||
|
||||
case UnitActionBuilded:
|
||||
color=ColorGray;
|
||||
break;
|
||||
|
||||
case UnitActionHarvest:
|
||||
color=ColorGreen;
|
||||
break;
|
||||
|
||||
case UnitActionMineGold:
|
||||
color=ColorGreen;
|
||||
break;
|
||||
|
||||
case UnitActionHaulOil:
|
||||
color=ColorGreen;
|
||||
break;
|
||||
|
||||
case UnitActionReturnGoods:
|
||||
color=ColorGreen;
|
||||
break;
|
||||
|
||||
case UnitActionDemolish:
|
||||
color=ColorRed;
|
||||
break;
|
||||
|
||||
default:
|
||||
color=ColorGray;
|
||||
DebugLevel1Fn("Unknown action %d\n",unit->Orders[i].Action);
|
||||
break;
|
||||
}
|
||||
VideoDrawLineClip(color,x1,y1,x2,y2);
|
||||
VideoFillCircleClip(color,x2,y2,2);
|
||||
x1=x2;
|
||||
y1=y2;
|
||||
}
|
||||
#else
|
||||
int x1;
|
||||
int y1;
|
||||
int x2;
|
||||
|
@ -790,6 +925,7 @@ local void ShowOrder(const Unit* unit)
|
|||
VideoFillCircleClip(color,x2,y2,2);
|
||||
|
||||
//DrawPath(unit);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -797,6 +933,7 @@ local void ShowOrder(const Unit* unit)
|
|||
**
|
||||
** 1) Must draw underground/underwater units. (FUTURE extension)
|
||||
** 2) Must draw buildings and corpse.
|
||||
** FIXME: Bridges?
|
||||
** 3) Must draw land/sea units.
|
||||
** 4) Must draw decoration units. (FUTURE extension)
|
||||
** 5) Must draw low air units.
|
||||
|
@ -861,6 +998,34 @@ local void DrawBuilding(Unit* unit)
|
|||
DrawSelection(unit,type,x,y);
|
||||
#endif
|
||||
|
||||
#ifdef NEW_ORDERS
|
||||
//
|
||||
// Buildings under construction/upgrade/ready.
|
||||
//
|
||||
if( unit->Orders[0].Action==UnitActionBuilded ) {
|
||||
if( unit->Constructed || VideoGraphicFrames(type->Sprite)<=1 ) {
|
||||
DrawConstruction(type->OverlapFrame
|
||||
,frame&127
|
||||
,x+(type->TileWidth*TileSizeX)/2
|
||||
,y+(type->TileHeight*TileSizeY)/2);
|
||||
} else {
|
||||
DrawUnitType(type,frame,x,y);
|
||||
}
|
||||
} else if( unit->Orders[0].Action==UnitActionUpgradeTo ) {
|
||||
// FIXME: update frame hard coded.
|
||||
DrawUnitType(unit->Orders[0].Type,(frame&128)+1,x,y);
|
||||
} else {
|
||||
DrawUnitType(type,frame,x,y);
|
||||
}
|
||||
|
||||
// FIXME: johns: ugly check here should be removed!
|
||||
if( unit->Orders[0].Action!=UnitActionDie ) {
|
||||
DrawDecoration(unit,type,x,y);
|
||||
#if 0
|
||||
DrawSelection(unit,type,x,y);
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
//
|
||||
// Buildings under construction/upgrade/ready.
|
||||
//
|
||||
|
@ -879,16 +1044,12 @@ local void DrawBuilding(Unit* unit)
|
|||
DrawUnitType(type,frame,x,y);
|
||||
}
|
||||
|
||||
// FIXME: johns: ugly check here should be removed!
|
||||
if( unit->Command.Action!=UnitActionDie ) {
|
||||
DrawDecoration(unit,type,x,y);
|
||||
#if 0
|
||||
// FIXME: johns: ugly check here should be removed!
|
||||
if( unit->Command.Action!=UnitActionDie ) {
|
||||
DrawDecoration(unit,type,x,y);
|
||||
DrawSelection(unit,type,x,y);
|
||||
}
|
||||
#else
|
||||
// FIXME: johns: ugly check here should be removed!
|
||||
if( unit->Command.Action!=UnitActionDie ) {
|
||||
DrawDecoration(unit,type,x,y);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -963,10 +1124,17 @@ local void DrawUnit(Unit* unit)
|
|||
ShowOrder(unit);
|
||||
}
|
||||
|
||||
#ifdef NEW_ORDERS
|
||||
// FIXME: johns: ugly check here should be removed!
|
||||
if( unit->Orders[0].Action!=UnitActionDie ) {
|
||||
DrawDecoration(unit,type,x,y);
|
||||
}
|
||||
#else
|
||||
// FIXME: johns: ugly check here should be removed!
|
||||
if( unit->Command.Action!=UnitActionDie ) {
|
||||
DrawDecoration(unit,type,x,y);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -991,9 +1159,17 @@ global void DrawUnits(void)
|
|||
for( i=0; i<NumUnits; ++i ) {
|
||||
unit=Units[i];
|
||||
// FIXME: this tries to draw all corps, ohje
|
||||
if( unit->Type->Vanishes || unit->Command.Action==UnitActionDie ) {
|
||||
#ifdef NEW_ORDERS
|
||||
if( (unit->Type->Vanishes || unit->Orders[0].Action==UnitActionDie)
|
||||
&& UnitVisible(unit) ) {
|
||||
DrawUnit(unit);
|
||||
}
|
||||
#else
|
||||
if( (unit->Type->Vanishes || unit->Command.Action==UnitActionDie)
|
||||
&& UnitVisible(unit) ) {
|
||||
DrawUnit(unit);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
//
|
||||
// 2b) buildings
|
||||
|
|
Loading…
Add table
Reference in a new issue