Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

UM NOVO MODO DE CRIAR MAGIAS?

Tudo bem com vocês, grandes tibianos desse reino?

Quando eu criava magias, eu sempre notei a quantidade de linhas que uma boa e trabalhada magia adquire ao se finalizar o script.

Por um tempinho, estudei como funcionava toda a estrutura e pensei em como criar um único bloco de código para configurar a magia uma vez só. Os spellmakers de plantão comprovam: Se uma magia com vários efeitos e tipos de dano é criada, você precisa criar muitas variáveis locais.

Então, resolvi criar uma tabela que tratava essas variáveis locais como indexes e seus atributos como conteúdo de tabelas secundárias. Nascia esse novo modo de programar magias, que parece um tanto versátil e ao mesmo tempo, reduz o tamanho de uma magia.

O SCRIPT

O script é bem simples, uma tabela bem básica que qualquer criança configura e se diverte e blocos de códigos que, olha que legal, você não precisa mexer. :)

Veja abaixo o novo modelo:


local spell = {

	{

		damage = COMBAT_ICEDAMAGE,

		effect = {CONST_ME_ICEATTACK},

		formula = {0.2, 3, 0.2, 4.2, 200, 300},

		area = createCombatArea({

			{0, 0, 0, 0, 0},

			{0, 0, 1, 0, 0},

			{0, 1, 2, 1, 0},

			{0, 0, 1, 0, 0},

			{0, 0, 0, 0, 0}})

	}

}


local returnSpell = {}


for var, config in ipairs(spell) do

	returnSpell[var] = createCombatObject()

	setCombatParam(returnSpell[var], COMBAT_PARAM_TYPE, config.damage)

	setCombatParam(returnSpell[var], COMBAT_PARAM_EFFECT, (type(config.effect) == "table" and config.effect[1] or config.effect))

	if type(config.effect) == "table" and config.effect[2] ~= nil then setCombatParam(returnSpell[var], COMBAT_PARAM_DISTANCEEFFECT, config.effect[2]) end

	if config.area then setCombatArea(returnSpell[var], config.area) end


	function getSpellDamage(cid, level, maglevel)

		local min = ((level*config.formula[1] + maglevel*config.formula[2]) + config.formula[5])

		local max = ((level*config.formula[3] + maglevel*config.formula[4]) + config.formula[6])

		return -min, -max

	end

	setCombatCallback(returnSpell[var], CALLBACK_PARAM_LEVELMAGICVALUE, "getSpellDamage")

end


function onCallCombat(parameters)

	return doCombat(unpack(parameters))

end


function onCastSpell(cid, var)

	if #returnSpell > 1 then

		for i = 1, #returnSpell do

			addEvent(onCallCombat, (i*280)+32, {cid, returnSpell[i], var})

		end

	else

		doCombat(cid, ret[1], var)

	end

	return true

end

Parece que eu compliquei tudo, né? Pois bem, finja que você não vê nada aí, apenas essa tabela abaixo:

local spell = {

	{

		damage = COMBAT_ICEDAMAGE,

		effect = {CONST_ME_ICEATTACK},

		formula = {0.2, 3, 0.2, 4.2, 200, 300},

		area = createCombatArea({

			{0, 0, 0, 0, 0},

			{0, 0, 1, 0, 0},

			{0, 1, 2, 1, 0},

			{0, 0, 1, 0, 0},

			{0, 0, 0, 0, 0}})

	}

}

Aqui que você irá configurar sua magia, como ela vai funcionar, que área que ela irá atingir e etcétera. Vou comentar cada linha da tabela para que você entenda:

local spell = {

	{

		damage = COMBAT_ICEDAMAGE,

		effect = {CONST_ME_ICEATTACK},

		formula = {0.2, 3, 0.2, 4.2, 200, 300},

		area = createCombatArea({

			{0, 0, 0, 0, 0},

			{0, 0, 1, 0, 0},

			{0, 1, 2, 1, 0},

			{0, 0, 1, 0, 0},

			{0, 0, 0, 0, 0}})

	}

}

Sobre a fórmula, você não precisa mais ter dor de cabeça como você vai diminuir o dano da sua magia e etcétera. Veja o quê cada número significa abaixo:

formula = {MIN_LEVEL, MIN_MAGLEVEL, MAX_LEVEL, MAX_MAGLEVEL, MIN_OFFSET, MAX_OFFSET}


min = (level*MIN_LEVEL + maglevel * MIN_MAGLEVEL) + MIN_OFFSET

max = (level*MAX_LEVEL + maglevel * MAX_MAGLEVEL) + MAX_OFFSET

E sobre a área, você pode usar áreas pré-configuras naquele arquivo spells.lua dentro de spells/lib, assim você diminuirá ainda mais o código.

area = createCombatArea(AREA_BEAM4)

Se a magia for do tipo "strike", você pode configurar o efeito de distância assim:

effect = {CONST_ME_ICEATTACK, CONST_ANI_ICE}

Para criar uma magia com múltiplos danos, basta duplicar, triplicar, conforme sua necessidade a sub-tabela dentro da tabela principal - atenção - não esqueça de separar as várias subtabelas com uma vírgula, por exemplo:

local spell = {

	{

		damage = COMBAT_ICEDAMAGE, -- O tipo de dano

		effect = {CONST_ME_ICEATTACK}, -- Os efeitos da magia

		formula = {0.2, 3, 0.2, 4.2, 200, 300}, -- A formula de dano da magia

		area = createCombatArea({ -- Area da magia

			{0, 0, 0, 0, 0},

			{0, 0, 1, 0, 0},

			{0, 1, 2, 1, 0},

			{0, 0, 1, 0, 0},

			{0, 0, 0, 0, 0}})

	}, -- virgula 

	{

		damage = COMBAT_ICEDAMAGE, -- O tipo de dano

		effect = {CONST_ME_ICEATTACK}, -- Os efeitos da magia

		formula = {0.2, 3, 0.2, 4.2, 200, 300}, -- A formula de dano da magia

		area = createCombatArea({ -- Area da magia

			{0, 0, 0, 0, 0},

			{0, 0, 1, 0, 0},

			{0, 1, 2, 1, 0},

			{0, 0, 1, 0, 0},

			{0, 0, 0, 0, 0}})

	}

}

[/code]

[size=3][font=tahoma,geneva,sans-serif]Essa é uma magia com dois hits de gelo, se você entendeu todo o tópico :)[/font][/size]

[size=3][font=tahoma,geneva,sans-serif][hr][/font][/size]

[size=4][b][font=tahoma,geneva,sans-serif]CONCLUSÃO[/font][/b][/size]

[size=3][font=tahoma,geneva,sans-serif][hr][/font][/size]

[size=3][font=tahoma,geneva,sans-serif]Eu reconheço que esse novo modelo parece um pouco inútil e estranho, mas ele foi criado com intuíto de otimizar magias com múltiplos efeitos e tipos de dano.[/font][/size]

[size=3][font=tahoma,geneva,sans-serif]Até o próximo tópico, abraços.[/font][/size]

[size=3][font=tahoma,geneva,sans-serif][hr][/font][/size]

Editado por Lpz (veja o histórico de edições)

Postado

Realmente, com esse novo "conceito" criar/configurar uma mágia fica muito mais simples, pois a configuração dela é dividida em "blocos".

Reputado!

# Regras Gerais - TibiaKing.com #
Contato: [email protected]
Não respondo dúvidas via MP.


1C2tu.png4Tlqo.png1C2tu.png


 

  • 2 years later...
Postado

Desculpa reviver o tópico, mas 2 coisas, primeiro genial, fez funcionar minhas spells, antes o exhaust tava bugando nas spells de vários efeitos. OBRIGADO! dei Rep+

Segunda coisa, dessa sua forma as spells estão aumentando o ml dos personagens, tem como ao invés de aumentar o ml, aumentar o skill?

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 520.1k

Informação Importante

Confirmação de Termo