allow lifebar value to defined with a Number description in lua

This commit is contained in:
Tim Felgentreff 2018-11-03 12:11:01 +00:00
parent 2550f89e51
commit 3884cdafa7
2 changed files with 44 additions and 12 deletions

View file

@ -149,9 +149,10 @@ private:
class CContentTypeLifeBar : public CContentType
{
public:
CContentTypeLifeBar() : Index(-1), Width(0), Height(0), hasBorder(true), colors(NULL), values(NULL) {}
CContentTypeLifeBar() : Index(-1), ValueFunc(NULL), ValueMax(-1), Width(0), Height(0), hasBorder(true), colors(NULL), values(NULL) {}
virtual ~CContentTypeLifeBar()
{
FreeNumberDesc(ValueFunc);
delete[] colors;
delete[] values;
}
@ -161,6 +162,8 @@ public:
private:
int Index; /// Index of the variable to show, -1 if not.
NumberDesc *ValueFunc;/// Handler of the value function
int ValueMax; /// Max, when used with a value function
int Width; /// Width of the bar.
int Height; /// Height of the bar.
bool hasBorder; /// True for additional border.

View file

@ -273,13 +273,18 @@ static const CUnit *GetUnitRef(const CUnit &unit, EnumUnit e)
*/
/* virtual */ void CContentTypeLifeBar::Draw(const CUnit &unit, CFont *) const
{
Assert((unsigned int) this->Index < UnitTypeVar.GetNumberVariable());
if (!unit.Variable[this->Index].Max) {
return;
}
Uint32 color;
int f = (100 * unit.Variable[this->Index].Value) / unit.Variable[this->Index].Max;
int f;
if (this->Index != -1) {
Assert((unsigned int) this->Index < UnitTypeVar.GetNumberVariable());
if (!unit.Variable[this->Index].Max) {
return;
}
f = (100 * unit.Variable[this->Index].Value) / unit.Variable[this->Index].Max;
} else {
f = (100 * EvalNumber(this->ValueFunc)) / this->ValueMax;
f = f > 100 ? 100 : f;
}
int i = 0;
// get to right color
@ -494,10 +499,34 @@ static EnumUnit Str2EnumUnit(lua_State *l, const char *s)
for (lua_pushnil(l); lua_next(l, -2); lua_pop(l, 1)) {
const char *key = LuaToString(l, -2);
if (!strcmp(key, "Variable")) {
const char *const name = LuaToString(l, -1);
this->Index = UnitTypeVar.VariableNameLookup[name];
if (this->Index == -1) {
LuaError(l, "unknown variable '%s'" _C_ name);
if (lua_isstring(l, -1)) {
const char *const name = LuaToString(l, -1);
this->Index = UnitTypeVar.VariableNameLookup[name];
if (this->Index == -1) {
LuaError(l, "unknown variable '%s'" _C_ name);
}
} else {
if (!lua_istable(l, -1)) {
LuaError(l, "incorrect argument, need list of size 2 with {function, max} or a string with the name of a unit variable");
}
for (lua_pushnil(l); lua_next(l, -2); lua_pop(l, 1)) {
const char *key = LuaToString(l, -2);
if (!strcmp(key, "Max")) {
this->ValueMax = LuaToNumber(l, -1);
} else if (!strcmp(key, "Value")) {
this->ValueFunc = CclParseNumberDesc(l);
lua_pushnil(l); // ParseStringDesc eat token
} else {
lua_pop(l, 1);
LuaError(l, "unknow value '%s'" _C_ key);
}
}
if (this->ValueMax == -1) {
this->ValueMax = 100;
}
if (this->ValueFunc == NULL) {
LuaError(l, "didn't set a value function");
}
}
} else if (!strcmp(key, "Height")) {
this->Height = LuaToNumber(l, -1);
@ -542,7 +571,7 @@ static EnumUnit Str2EnumUnit(lua_State *l, const char *s)
if (this->Width <= 0) {
this->Width = 50; // Default value.
}
if (this->Index == -1) {
if (this->Index == -1 && this->ValueFunc == NULL) {
LuaError(l, "variable undefined for LifeBar");
}
if (this->colors == NULL || this->values == NULL) {