diff --git a/doc/scripts/magic.html b/doc/scripts/magic.html index ad25c8755..2766d7aa4 100644 --- a/doc/scripts/magic.html +++ b/doc/scripts/magic.html @@ -246,32 +246,23 @@ on the unit properties. Here is how a condition looks like: "max-slow-ticks", 10}</pre> Here are the supported parameters:<p> <dl> - <dt>"building", "true" or "false" or "only"</dt> + <dt>"alliance", "true" or "false" or "only"</dt> <dd>This is one of the bool parameters (can't think of a better name). It is - followed by "true", "false" or "only". Imagine this as a question, is the target a - building? The answer is yes/no. A "true" parameter makes it always pass(and + followed by "true", "false" or "only". Imagine this as a question, is the target in + alliance? The answer is yes/no. A "true" parameter makes it always pass(and it's the default.), "false" parameter passes when the answer is NO, and "only" passes only when the answer is yes.<br> It doesn't really makes sense to ever say true, since you might just as well - ommit it. "building false" means the spell won't work on buildings. "building - only" will make a spell that works only on buildings (can't think of any though). - This syntax is used for more that "building" - </dd> - <dt>"coward", "true" or "false" or "only"</dt> - <dd>This is a bool parameter too, just like building. I specifies the behaviour - for cowards, unit's that don't attack by themselves. For example you should not - cast an offensive buff (like bloodlust) on non-combat units. - </dd> - <dt>"alliance", "true" or "false" or "only"</dt> - <dd>This is a bool parameter too, just like building. I specifies the behaviour - for allied units. Your own units are considered allied too. + ommit it. "alliance false" means the spell won't work on allied units. "alliance + only" will make a spell that works only on allied units (can't think of any though). + Your own units are considered allied too. </dd> <dt>"opponent", "true" or "false" or "only"</dt> - <dd>This is a bool parameter too, just like building. I specifies the behaviour + <dd>This is a bool parameter too, just like alliance. I specifies the behaviour for opponent units. Neutral units are neither allied unit nor opponent units. </dd> <dt>"self", "true" or "false" or "only"</dt> - <dd>This is a bool parameter too, just like building. I it a bit more special, + <dd>This is a bool parameter too, just like alliance. I it a bit more special, since it specifies the behaviour for casting on yourself. <b>A LOT</b> of spells specify "self false", to disallow casting on yourself. </dd> diff --git a/doc/scripts/unittype.html b/doc/scripts/unittype.html index 7a9f395e8..8bd257ccb 100644 --- a/doc/scripts/unittype.html +++ b/doc/scripts/unittype.html @@ -122,8 +122,15 @@ DefineAnimations("animations-footman", Define boolean unit flags. Examples are organic, mechanical, undead, etc. Spells use these to determine who to hit, and units can be restricted too. -Try to avoid using names with other meanings (nothing from unit definitions -or spell condition definition.) +Try to avoid using names with other meanings (nothing from spell condition definition.) +Some Flags are already defined in the engine : the UnitType flags. +So following flags are the value of the unitType : +"Building", "BuilderOutSide", "BuilderLost", "ShoreBuilding", +"Coward", "Harvester", "Revealer", +"LandUnit", "AirUnit", "SeaUnit", +"ExplodeWhenKilled", "VisibleUnderFog", "PermanentCloack", "AttackFromTransporter", +"GroundAttack", "CanAttack", "CanHarvest", +"Vanishes", "Flip" <h4>Example</h4> diff --git a/src/include/spells.h b/src/include/spells.h index b1506265b..c513a4013 100644 --- a/src/include/spells.h +++ b/src/include/spells.h @@ -214,16 +214,11 @@ typedef struct ConditionInfo { #define CONDITION_FALSE 1 #define CONDITION_TRUE 0 #define CONDITION_ONLY 2 - char Coward; ///< Target is coward. Don't bloodlust them. char Alliance; ///< Target is allied. (neutral is neither allied, nor opponent) char Opponent; ///< Target is opponent. (neutral is neither allied, nor opponent) - char Building; ///< Target is a building. char TargetSelf; ///< Target is the same as the caster. char* BoolFlag; ///< User defined boolean flag. -#if 0 - // TODO: NOT IMPLEMENTED: - char UnitBuffed; ///< Target is buffed(haste/slow/bloodlust). Dispel magic? -#endif + // // Conditions related to vitals: // diff --git a/src/include/unittype.h b/src/include/unittype.h index 86426384e..064867ecd 100644 --- a/src/include/unittype.h +++ b/src/include/unittype.h @@ -631,6 +631,30 @@ typedef struct _variable_type_ { char Enable; ///< True if the unit doesn't have this variable. (f.e shield) } VariableType; +// Index for boolflag aready defined +#define COWARD_INDEX 0 +#define BUILDING_INDEX 1 +#define FLIP_INDEX 2 +#define REVEALER_INDEX 3 +#define LANDUNIT_INDEX 4 +#define AIRUNIT_INDEX 5 +#define SEAUNIT_INDEX 6 +#define EXPLODEWHENKILLED_INDEX 7 +#define VISIBLEUNDERFOG_INDEX 8 +#define PERMANENTCLOAK_INDEX 9 +#define DETECTCLOAK_INDEX 10 +#define ATTACKFROMTRANSPORTER_INDEX 11 +#define VANISHES_INDEX 12 +#define GROUNDATTACK_INDEX 13 +#define SHOREBUILDING_INDEX 14 +#define CANATTACK_INDEX 15 +#define BUILDEROUTSIDE_INDEX 16 +#define BUILDERLOST_INDEX 17 +#define CANHARVEST_INDEX 18 +#define HARVESTER_INDEX 19 + +#define NBOOLALREADYDEFINED HARVESTER_INDEX + 1 // Hardcoded boolflag + // Index for variable already defined. #define HP_INDEX 0 #define BUILD_INDEX 1 @@ -781,7 +805,7 @@ struct _building_restrictions_ { } Data; BuildRestriction* Next; }; - + /** ** Base structure of unit-type diff --git a/src/stratagus/script_spell.cpp b/src/stratagus/script_spell.cpp index 50025cf10..d7a6d875b 100644 --- a/src/stratagus/script_spell.cpp +++ b/src/stratagus/script_spell.cpp @@ -541,11 +541,7 @@ static void CclSpellCondition(lua_State* l, ConditionInfo* condition) value = LuaToString(l, -1); lua_pop(l, 1); ++j; - if (!strcmp(value, "coward")) { - lua_rawgeti(l, -1, j + 1); - condition->Coward = Ccl2Condition(l, LuaToString(l, -1)); - lua_pop(l, 1); - } else if (!strcmp(value, "alliance")) { + if (!strcmp(value, "alliance")) { lua_rawgeti(l, -1, j + 1); condition->Alliance = Ccl2Condition(l, LuaToString(l, -1)); lua_pop(l, 1); @@ -553,10 +549,6 @@ static void CclSpellCondition(lua_State* l, ConditionInfo* condition) lua_rawgeti(l, -1, j + 1); condition->Opponent = Ccl2Condition(l, LuaToString(l, -1)); lua_pop(l, 1); - } else if (!strcmp(value, "building")) { - lua_rawgeti(l, -1, j + 1); - condition->Building = Ccl2Condition(l, LuaToString(l, -1)); - lua_pop(l, 1); } else if (!strcmp(value, "self")) { lua_rawgeti(l, -1, j + 1); condition->TargetSelf = Ccl2Condition(l, LuaToString(l, -1)); @@ -981,15 +973,9 @@ static void SaveSpellCondition(CLFile* file, ConditionInfo* condition) // First save data related to flags. // NOTE: (int) is there to keep compilers happy. // - if (condition->Coward != CONDITION_TRUE) { - CLprintf(file, "coward %s ", condstrings[(int)condition->Coward]); - } if (condition->Alliance != CONDITION_TRUE) { CLprintf(file, "alliance %s ", condstrings[(int)condition->Alliance]); } - if (condition->Building != CONDITION_TRUE) { - CLprintf(file, "building %s ", condstrings[(int)condition->Building]); - } if (condition->TargetSelf != CONDITION_TRUE) { CLprintf(file, "self %s ", condstrings[(int)condition->TargetSelf]); } diff --git a/src/stratagus/spells.cpp b/src/stratagus/spells.cpp index decd196a3..b37bbdef8 100644 --- a/src/stratagus/spells.cpp +++ b/src/stratagus/spells.cpp @@ -837,16 +837,6 @@ static int PassCondition(const Unit* caster, const SpellType* spell, const Unit* if (!target) { return 1; } - if (condition->Building != CONDITION_TRUE) { - if ((condition->Building == CONDITION_ONLY) ^ (target->Type->Building)) { - return 0; - } - } - if (condition->Coward != CONDITION_TRUE) { - if ((condition->Coward == CONDITION_ONLY) ^ (target->Type->Coward)) { - return 0; - } - } for (i = 0; i < UnitTypeVar.NumberBoolFlag; i++) { // User defined flags if (condition->BoolFlag[i] != CONDITION_TRUE) { if ((condition->BoolFlag[i] == CONDITION_ONLY) ^ (target->Type->BoolFlag[i])) { diff --git a/src/unit/script_unittype.cpp b/src/unit/script_unittype.cpp index b49258098..46a283340 100644 --- a/src/unit/script_unittype.cpp +++ b/src/unit/script_unittype.cpp @@ -1698,6 +1698,7 @@ static int CclDefineDecorations(lua_State* l) void UpdateUnitVariables(const Unit* unit) { int i; + const UnitType* type; // unit->Type. for (i = 0; i < NVARALREADYDEFINED; i++) { // default values unit->Variable[i].Value = 0; @@ -1831,6 +1832,29 @@ void UpdateUnitVariables(const Unit* unit) unit->Variable[i].Enable &= unit->Variable[i].Max > 0; Assert(unit->Variable[i].Value <= unit->Variable[i].Max); } + + // BoolFlag + type = unit->Type; + type->BoolFlag[COWARD_INDEX] = type->Coward; + type->BoolFlag[BUILDING_INDEX] = type->Building; + type->BoolFlag[FLIP_INDEX] = type->Flip; + type->BoolFlag[REVEALER_INDEX] = type->Revealer; + type->BoolFlag[LANDUNIT_INDEX] = type->LandUnit; + type->BoolFlag[AIRUNIT_INDEX] = type->AirUnit; + type->BoolFlag[SEAUNIT_INDEX] = type->SeaUnit; + type->BoolFlag[EXPLODEWHENKILLED_INDEX] = type->ExplodeWhenKilled; + type->BoolFlag[VISIBLEUNDERFOG_INDEX] = type->VisibleUnderFog; + type->BoolFlag[PERMANENTCLOAK_INDEX] = type->PermanentCloak; + type->BoolFlag[DETECTCLOAK_INDEX] = type->DetectCloak; + type->BoolFlag[ATTACKFROMTRANSPORTER_INDEX] = type->AttackFromTransporter; + type->BoolFlag[VANISHES_INDEX] = type->Vanishes; + type->BoolFlag[GROUNDATTACK_INDEX] = type->GroundAttack; + type->BoolFlag[SHOREBUILDING_INDEX] = type->ShoreBuilding; + type->BoolFlag[CANATTACK_INDEX] = type->CanAttack; + type->BoolFlag[BUILDEROUTSIDE_INDEX] = type->BuilderOutside; + type->BoolFlag[BUILDERLOST_INDEX] = type->BuilderLost; + type->BoolFlag[CANHARVEST_INDEX] = type->CanHarvest; + type->BoolFlag[HARVESTER_INDEX] = type->Harvester; } /** @@ -1844,14 +1868,23 @@ void InitDefinedVariables() "AttackRange", "PiercingDamage", "BasicDamage", "Damage", "ExtraDamage", "PosX", "PosY", "Slot" }; // names of the variable. - int i; + const char* boolflag = "DefineBoolFlags(\"Coward\", \"Building\", \"Flip\"," + "\"Revealer\", \"LandUnit\", \"AirUnit\", \"SeaUnit\", \"ExplodeWhenKilled\"," + "\"VisibleUnderFog\", \"PermanentCloack\", \"AttackFromTransporter\"," + "\"Vanishes\", \"GroundAttack\", \"ShoreBuilding\", \"CanAttack\"," + "\"BuilderOutSide\", \"BuilderLost\", \"CanHarvest\", \"Harvester\")"; + int i; // iterator for var and boolflag. + // Variables. UnitTypeVar.VariableName = calloc(NVARALREADYDEFINED, sizeof(*UnitTypeVar.VariableName)); for (i = 0; i < NVARALREADYDEFINED; i++) { UnitTypeVar.VariableName[i] = strdup(var[i]); } UnitTypeVar.Variable = calloc(i, sizeof(*UnitTypeVar.Variable)); UnitTypeVar.NumberVariable = i; + + // Boolflags. + CclCommand(boolflag); } /**