summaryrefslogtreecommitdiff
path: root/src/scripting
diff options
context:
space:
mode:
authorErik Schilling <ablu.erikschilling@googlemail.com>2013-04-23 23:36:09 +0200
committerErik Schilling <ablu.erikschilling@googlemail.com>2013-08-26 22:56:46 +0200
commitc2f00b2f3ba920cb25333d19a1d37d251342caf8 (patch)
tree5d782446b6679c9f74661d64a3c6d9f778136717 /src/scripting
parent10c33df8e5a13e7e7b4a3ea203516536582b2f4b (diff)
downloadmanaserv-c2f00b2f3ba920cb25333d19a1d37d251342caf8.tar.gz
manaserv-c2f00b2f3ba920cb25333d19a1d37d251342caf8.tar.bz2
manaserv-c2f00b2f3ba920cb25333d19a1d37d251342caf8.tar.xz
manaserv-c2f00b2f3ba920cb25333d19a1d37d251342caf8.zip
[Abilities] Added support for a global cooldown
Each ability can now define a cooldown that prevents the player from using other abilities for a while. The time of this cooldown can be set to any attribute. The modified value of the attribute is the value of the cooldown in game ticks. The cooldown will be automatically started if the ability has `autoconsume` set to true. Otherwise a script has to call entity:cooldown_ability(ability).
Diffstat (limited to 'src/scripting')
-rw-r--r--src/scripting/lua.cpp55
-rw-r--r--src/scripting/luautil.cpp12
-rw-r--r--src/scripting/luautil.h28
3 files changed, 59 insertions, 36 deletions
diff --git a/src/scripting/lua.cpp b/src/scripting/lua.cpp
index 63c48abd..2f84dd6e 100644
--- a/src/scripting/lua.cpp
+++ b/src/scripting/lua.cpp
@@ -1292,9 +1292,10 @@ static int chr_set_quest(lua_State *s)
static int entity_set_ability_mana(lua_State *s)
{
Entity *c = checkCharacter(s, 1);
- const int ability = checkAbility(s, 2);
+ auto *abilityInfo = checkAbility(s, 2);
const int mana = luaL_checkint(s, 3);
- if (!c->getComponent<AbilityComponent>()->setAbilityMana(ability, mana))
+ if (!c->getComponent<AbilityComponent>()->setAbilityMana(abilityInfo->id,
+ mana))
{
luaL_error(s,
"set_ability_mana called with ability "
@@ -1317,14 +1318,35 @@ static int entity_get_ability_mana(lua_State *s)
{
Entity *c = checkCharacter(s, 1);
auto *abilityComponent = c->getComponent<AbilityComponent>();
- const int ability = checkAbility(s, 2);
- AbilityMap::iterator it = abilityComponent->findAbility(ability);
+ auto *abilityInfo = checkAbility(s, 2);
+ AbilityMap::iterator it = abilityComponent->findAbility(abilityInfo->id);
luaL_argcheck(s, it != abilityComponent->getAbilities().end(), 2,
"character does not have ability");
lua_pushinteger(s, it->second.currentPoints);
return 1;
}
+/** LUA entity:cooldown_ability (being)
+ * entity:cooldown_ability(int abilityid)
+ * entity:cooldown_ability(string abilityname)
+ **
+ * Starts the cooldown of the passed ability. No other ability will be useable
+ * in this time.
+ *
+ * You do not need to call this if the attribute is set to ''autoconsume''.
+ *
+ * **Note:** When passing the ''abilityname'' as parameter make sure that it is
+ * formatted in this way: <setname>_<abilityname> (for eg. "Magic_Healingspell").
+ */
+static int entity_cooldown_ability(lua_State *s)
+{
+ Entity *c = checkCharacter(s, 1);
+ auto *abilityComponent = c->getComponent<AbilityComponent>();
+ auto *abilityInfo = checkAbility(s, 2);
+ abilityComponent->startCooldown(*c, abilityInfo);
+ return 0;
+}
+
/** LUA entity:walk (being)
* entity:walk(int pixelX, int pixelY [, int walkSpeed])
**
@@ -2353,10 +2375,11 @@ static int entity_give_ability(lua_State *s)
{
// cost_type is ignored until we have more than one cost type
Entity *c = checkCharacter(s, 1);
- const int ability = checkAbility(s, 2);
+ auto *abilityInfo = checkAbility(s, 2);
const int currentMana = luaL_optint(s, 3, 0);
- c->getComponent<AbilityComponent>()->giveAbility(ability, currentMana);
+ c->getComponent<AbilityComponent>()->giveAbility(abilityInfo->id,
+ currentMana);
return 0;
}
@@ -2923,11 +2946,8 @@ static int get_distance(lua_State *s)
*/
static int get_ability_info(lua_State *s)
{
- const int ability = checkAbility(s, 1);
- AbilityManager::AbilityInfo *info =
- abilityManager->getAbilityInfo(ability);
- luaL_argcheck(s, info, 1, "invalid ability");
- LuaAbilityInfo::push(s, info);
+ auto *abilityInfo = checkAbility(s, 1);
+ LuaAbilityInfo::push(s, abilityInfo);
return 1;
}
@@ -2941,7 +2961,7 @@ static int get_ability_info(lua_State *s)
*/
static int abilityinfo_get_name(lua_State *s)
{
- AbilityManager::AbilityInfo *info = LuaAbilityInfo::check(s, 1);
+ auto *info = LuaAbilityInfo::check(s, 1);
push(s, info->name);
return 1;
}
@@ -2956,7 +2976,7 @@ static int abilityinfo_get_name(lua_State *s)
*/
static int abilityinfo_get_needed_mana(lua_State *s)
{
- AbilityManager::AbilityInfo *info = LuaAbilityInfo::check(s, 1);
+ auto *info = LuaAbilityInfo::check(s, 1);
lua_pushinteger(s, info->neededPoints);
return 1;
}
@@ -2972,7 +2992,7 @@ static int abilityinfo_get_needed_mana(lua_State *s)
*/
static int abilityinfo_is_rechargeable(lua_State *s)
{
- AbilityManager::AbilityInfo *info = LuaAbilityInfo::check(s, 1);
+ auto *info = LuaAbilityInfo::check(s, 1);
lua_pushboolean(s, info->rechargeable);
return 1;
}
@@ -2988,7 +3008,7 @@ static int abilityinfo_is_rechargeable(lua_State *s)
*/
static int abilityinfo_on_use(lua_State *s)
{
- AbilityManager::AbilityInfo *info = LuaAbilityInfo::check(s, 1);
+ auto *info = LuaAbilityInfo::check(s, 1);
Script *script = getScript(s);
luaL_checktype(s, 2, LUA_TFUNCTION);
script->assignCallback(info->useCallback);
@@ -3006,7 +3026,7 @@ static int abilityinfo_on_use(lua_State *s)
*/
static int abilityinfo_on_recharged(lua_State *s)
{
- AbilityManager::AbilityInfo *info = LuaAbilityInfo::check(s, 1);
+ auto *info = LuaAbilityInfo::check(s, 1);
Script *script = getScript(s);
luaL_checktype(s, 2, LUA_TFUNCTION);
script->assignCallback(info->rechargedCallback);
@@ -3024,7 +3044,7 @@ static int abilityinfo_on_recharged(lua_State *s)
*/
static int abilitiyinfo_get_category(lua_State *s)
{
- AbilityManager::AbilityInfo *info = LuaAbilityInfo::check(s, 1);
+ auto *info = LuaAbilityInfo::check(s, 1);
push(s, info->categoryName);
return 1;
}
@@ -3748,6 +3768,7 @@ LuaScript::LuaScript():
{ "unequip_item", entity_unequip_item },
{ "set_ability_mana", entity_set_ability_mana },
{ "ability_mana", entity_get_ability_mana },
+ { "cooldown_ability", entity_cooldown_ability },
{ "walk", entity_walk },
{ "damage", entity_damage },
{ "heal", entity_heal },
diff --git a/src/scripting/luautil.cpp b/src/scripting/luautil.cpp
index f21e4895..f889aa6c 100644
--- a/src/scripting/luautil.cpp
+++ b/src/scripting/luautil.cpp
@@ -223,14 +223,16 @@ int checkSkill(lua_State *s, int p)
return id;
}
-int checkAbility(lua_State *s, int p)
+AbilityManager::AbilityInfo *checkAbility(lua_State *s, int p)
{
+ AbilityManager::AbilityInfo *abilityInfo;
if (lua_isnumber(s, p))
- return luaL_checkint(s, p);
+ abilityInfo = abilityManager->getAbilityInfo(luaL_checkint(s, p));
+ else
+ abilityInfo = abilityManager->getAbilityInfo(luaL_checkstring(s, p));
- int id = abilityManager->getId(luaL_checkstring(s, p));
- luaL_argcheck(s, id != 0, p, "invalid ability name");
- return id;
+ luaL_argcheck(s, abilityInfo != nullptr, p, "invalid ability");
+ return abilityInfo;
}
diff --git a/src/scripting/luautil.h b/src/scripting/luautil.h
index 2f3c15c8..9ea11c07 100644
--- a/src/scripting/luautil.h
+++ b/src/scripting/luautil.h
@@ -168,20 +168,20 @@ typedef LuaUserData<MonsterClass> LuaMonsterClass;
typedef LuaUserData<StatusEffect> LuaStatusEffect;
typedef LuaUserData<AbilityManager::AbilityInfo> LuaAbilityInfo;
-Script * getScript(lua_State *s);
-
-ItemClass * getItemClass(lua_State *s, int p);
-MonsterClass * getMonsterClass(lua_State *s, int p);
-
-Entity * checkActor(lua_State *s, int p);
-Entity * checkBeing(lua_State *s, int p);
-Entity * checkCharacter(lua_State *s, int p);
-ItemClass * checkItemClass(lua_State *s, int p);
-Entity * checkMonster(lua_State *s, int p);
-MonsterClass * checkMonsterClass(lua_State *s, int p);
-Entity * checkNpc(lua_State *s, int p);
-int checkSkill(lua_State *s, int p);
-int checkAbility(lua_State *s, int p);
+Script * getScript(lua_State *s);
+
+ItemClass * getItemClass(lua_State *s, int p);
+MonsterClass * getMonsterClass(lua_State *s, int p);
+
+Entity * checkActor(lua_State *s, int p);
+Entity * checkBeing(lua_State *s, int p);
+Entity * checkCharacter(lua_State *s, int p);
+ItemClass * checkItemClass(lua_State *s, int p);
+Entity * checkMonster(lua_State *s, int p);
+MonsterClass * checkMonsterClass(lua_State *s, int p);
+Entity * checkNpc(lua_State *s, int p);
+int checkSkill(lua_State *s, int p);
+AbilityManager::AbilityInfo *checkAbility(lua_State *s, int p);
MapComposite * checkCurrentMap(lua_State *s, Script *script = 0);
Script::Thread* checkCurrentThread(lua_State *s, Script *script = 0);