Foro especializado en Warcraft III y su editor
 
BuscarEntrar al ChatboxPortal del foroÍndiceSpellsRegistrarseConectarse
Eventos Actuales
¡ Bienvenido Invitado !

Editar Perfil

Tus temas
Tus Mensajes ()

Enlaces rápidos








Comparte
 

 [System] RIESGO

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
WonderWoman
Capitán
WonderWoman


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 129
Reputación Reputación : 28
Monedas de oro : 830
Monedas de Platino : 0 [System] RIESGO Empty

Inventario :
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10

[System] RIESGO Empty
Mensaje(#) Tema: [System] RIESGO [System] RIESGO Clock10Dom Ene 12, 2014 8:52 pm

RIESGO

De que se trata todo esto??? Bien, dejenme contarles una pequeña historia...
Hace poco mas de un año cuando estaba hecho todo un pro en el DotA me di cuenta que la principal razón de mi gran mejora en el juego había sido aprender a pararme con cualquier personaje y evitar situaciones riesgosas que la mayoría de los usuarios (n00bs de mierda) no se daban cuenta que existían, también note que si la AI del juego que tiene una respuesta mas allá de lo posible a la hora de denegar un creep o hacer un combo de spells supiera mejor cuales situaciones son peligrosas y cuales no, seria muy hardcore y no necesitaría ese oro extra y bonus de experiencia que tiene.


Continuacion Tecnica de la Historia :p
Entonces nació mi sistema de riesgo, un sistema que permite elegir un punto del mapa y saber cuanto riesgo (cuantitativamente) existe al estar allí a través de un campo de potencial de (x e y) diferenciable hasta la primera derivada. La razón de que el campo sea diferenciable es poder obtener mediante el gradiente un campo vectorial que indique la dirección de máximo cambio, al obtener esta derivada se puede saber hacia donde conviene moverse para evitar estar en una situación de riesgo.
Para generar el campo potencial hay que asignarle funciones de riesgo en el espacio a las unidades, spells, dummys o lo que sea que indique un factor de peligro hacia la unidad/unidades en interés.
Cada una de estas funciones generan un campo de potencial de riesgo y sumandolas se obtiene el campo total, por lo tanto debe valer el teorema de superposición.
Con condiciones tan fuertes las únicas funciones posibles para describir riesgo parecían ser las funciones gaussianas (Campana de gauss), sin embargo y como la derivada en el punto se puede obtener mediante aproximación ya que no es necesaria una gran precisión para esta aplicación decidí ampliar a funciones continuas en todo su dominio.


Utilizacion del sistema
El sistema requiere llamar una función inicializadora para comenzar a funcionar.
Se puede llamar en cualquier momento a una función publica para obtener el riesgo en una posición (X, Y), también se puede llamar a una función publica para obtener la dirección de máximo cambio de riesgo en radianes en una posición (X, Y)
El sistema obtiene el riesgo y las direcciones de máximo cambio a través de campos generados por Objetos de Riesgo, contanto con las funciones creadoras y destructoras de dichos objetos.
El handle de un objeto creado es retornado por la función creadora y es un entero. Este handle es necesario para destruir el objeto mediante la función destructora.
El sistema permite crear objetos de riesgo de simetría radial con decaimiento Cuadratico, Exponencial o Gaussiano, y objetos de riesgo con forma de pseudo-conos que poseen un decaimiento mixto Gaussiano-Cuadratico-Lineal. Estos objetos pueden ser creados en posiciones (X, Y) y los pseudo-conos con angulo y apertura ademas. O también pueden ser creados sobre unidades con lo que su posición en el campo es dinámica y es igual a la posición de la unidad (en el caso de los pseudo-conos también sucede lo mismo con el angulo).

[JASS]//LIBRERIA PARA FACTOR DE RIESGO EN POSICION (por WonderWoman)
//Version Beta 1.0c


//--------------Funciones publicas

//function IniciarRIESGO takes real base returns nothing
//function CambiarBase takes real base returns nothing
//function COR_UnidadCircularC takes unit u, real radio, real riesgo, boolean destruirenmuerte returns integer
//function COR_UnidadCircularE takes unit u, real radio, real riesgo, boolean destruirenmuerte returns integer
//function COR_UnidadCircularG takes unit u, real radio, real riesgo, boolean destruirenmuerte returns integer
//function COR_XYCircularC takes real x, real y, real radio, real riesgo returns integer
//function COR_XYCircularE takes real x, real y, real radio, real riesgo returns integer
//function COR_XYCircularG takes real x, real y, real radio, real riesgo returns integer
//function COR_UnidadConicaG takes unit u, real apertura, real radio, real riesgo, boolean destruirenmuerte returns integer
//function COR_XYConicaG takes real x, real y, real angulo, real apertura, real radio, real riesgo returns integer
//function DestruirObjetodeRiesgo takes integer ID returns nothing
//function ObtenerRiesgo takes real xP, real yP returns real
//function DerivadaDireccional takes real x, real y returns real
//function DerivadaDireccionalEpsilon takes real x, real y, real epsilon returns real
//function DerivadaDireccionalEpsilonTriplePrecision takes real x, real y, real epsilon returns real

library RIESGO initializer OnInit

globals
private constant integer R_UNIDAD = 0
private constant integer R_X = 1
private constant integer R_Y = 2
private constant integer R_TIPO = 3
private constant integer R_DISTANCIA = 4
private constant integer R_RIESGO = 5
private constant integer R_ANGULO = 6
private constant integer R_APERTURA = 7
//
private constant integer T_NULO = 0
private constant integer T_UNIDADCIRCULARCUADRATICA = 1
private constant integer T_UNIDADCIRCULAREXPONENCIAL = 2
private constant integer T_UNIDADCIRCULARGAUSSIANA = 3
private constant integer T_POSICIONCIRCULARCUADRATICA = 4
private constant integer T_POSICIONCIRCULAREXPONENCIAL = 5
private constant integer T_POSICIONCIRCULARGAUSSIANA = 6
private constant integer T_UNIDADCONICAGAUSSIANA = 7
private constant integer T_POSICIONCONICAGAUSSIANA = 8
//
private real Base = 0.0
private integer IDS = 0
private integer array IDLIST
private hashtable ID_hash = InitHashtable()
private boolean RiesgoIniciado = false
private hashtable ObjetodeRiesgo = InitHashtable()
private real xRisk = 0.0
private real yRisk = 0.0
private trigger Muerte = CreateTrigger()
private trigger array Funciones
private real Riesgo = 0.0
private integer pI = 0
constant real ERROR = 99.99
endglobals

//Cuadrado
private function Cuadrado takes real num returns real
return num * num
endfunction

//Modulo
private function wwModulo takes real a, real b returns real
return SquareRoot(a*a + b*b)
endfunction

private function ObtenerID takes nothing returns integer
local integer id = 0
set IDS = IDS + 1
set id = IDLIST[IDS]
if id == 0 then
set IDLIST[IDS] = IDS
set id = IDS
endif
call SaveInteger(ID_hash, 0, id, IDS)
return id
endfunction

private function DestruirID takes integer id returns nothing
local integer idpos = LoadInteger(ID_hash, 0, id)
if idpos != 0 or idpos != null then
set IDLIST[idpos] = IDLIST[IDS]
call SaveInteger(ID_hash, 0, IDLIST[IDS], idpos)
set IDLIST[IDS] = id
call SaveInteger(ID_hash, 0, id, 0)
set IDS = IDS - 1
endif
endfunction

private function CrearObjetodeRiesgo takes integer tipo, unit u, real x, real y, real angulo, real apertura, real distancia, real riesgo, boolean destruirenmuerte returns integer
local integer NroObjeto = LoadInteger(ObjetodeRiesgo, -1, 0) + 1
local integer ID = ObtenerID()
//unidad
if destruirenmuerte and u!= null then
call SaveInteger(ObjetodeRiesgo, -2, GetHandleId(u), ID)
call SaveInteger(ObjetodeRiesgo, -3, ID, GetHandleId(u))
endif
//unidad
call SaveInteger(ObjetodeRiesgo, -1, 0, NroObjeto)
call SaveInteger(ObjetodeRiesgo, 0, ID, NroObjeto)
call SaveUnitHandle(ObjetodeRiesgo, NroObjeto, R_UNIDAD, u)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_X, x)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_Y, y)
call SaveInteger(ObjetodeRiesgo, NroObjeto, R_TIPO, tipo)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_DISTANCIA, distancia)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_RIESGO, riesgo)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_ANGULO, angulo)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_APERTURA, apertura)
return ID
endfunction

function DestruirObjetodeRiesgo takes integer ID returns nothing
local integer NroObjeto = LoadInteger(ObjetodeRiesgo, -1, 0)
local integer NroObjDes = LoadInteger(ObjetodeRiesgo, 0, ID)
call DestruirID(ID)
//unidad
call SaveInteger(ObjetodeRiesgo, -2, LoadInteger(ObjetodeRiesgo, -3, ID), 0)
call SaveInteger(ObjetodeRiesgo, -3, ID, 0)
//unidad
call SaveInteger(ObjetodeRiesgo, 0, ID, 0)
call SaveInteger(ObjetodeRiesgo, -1, 0, NroObjeto-1)
//TRASPASO
call SaveUnitHandle(ObjetodeRiesgo, NroObjDes, R_UNIDAD, LoadUnitHandle(ObjetodeRiesgo, NroObjeto, R_UNIDAD))
call SaveReal(ObjetodeRiesgo, NroObjDes, R_X, LoadReal(ObjetodeRiesgo, NroObjeto, R_X))
call SaveReal(ObjetodeRiesgo, NroObjDes, R_Y, LoadReal(ObjetodeRiesgo, NroObjeto, R_Y))
call SaveInteger(ObjetodeRiesgo, NroObjDes, R_TIPO, LoadInteger(ObjetodeRiesgo, NroObjeto, R_TIPO))
call SaveReal(ObjetodeRiesgo, NroObjDes, R_DISTANCIA, LoadReal(ObjetodeRiesgo, NroObjeto, R_DISTANCIA))
call SaveReal(ObjetodeRiesgo, NroObjDes, R_RIESGO, LoadReal(ObjetodeRiesgo, NroObjeto, R_RIESGO))
call SaveReal(ObjetodeRiesgo, NroObjDes, R_ANGULO, LoadReal(ObjetodeRiesgo, NroObjeto, R_ANGULO))
call SaveReal(ObjetodeRiesgo, NroObjDes, R_APERTURA, LoadReal(ObjetodeRiesgo, NroObjeto, R_APERTURA))
//NULLEO
call SaveUnitHandle(ObjetodeRiesgo, NroObjeto, R_UNIDAD, null)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_X, 0.0)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_Y, 0.0)
call SaveInteger(ObjetodeRiesgo, NroObjeto, R_TIPO, T_NULO)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_DISTANCIA, 0.0)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_RIESGO, 0.0)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_ANGULO, 0.0)
call SaveReal(ObjetodeRiesgo, NroObjeto, R_APERTURA, 0.0)
endfunction

//FUNCIONES CREADORAS
function COR_UnidadCircularC takes unit u, real radio, real riesgo, boolean destruirenmuerte returns integer
return CrearObjetodeRiesgo(T_UNIDADCIRCULARCUADRATICA, u, 0.0, 0.0, 0.0, 0.0, radio, riesgo, destruirenmuerte)
endfunction

function COR_UnidadCircularE takes unit u, real radio, real riesgo, boolean destruirenmuerte returns integer
return CrearObjetodeRiesgo(T_UNIDADCIRCULAREXPONENCIAL, u, 0.0, 0.0, 0.0, 0.0, radio, riesgo, destruirenmuerte)
endfunction

function COR_UnidadCircularG takes unit u, real radio, real riesgo, boolean destruirenmuerte returns integer
return CrearObjetodeRiesgo(T_UNIDADCIRCULARGAUSSIANA, u, 0.0, 0.0, 0.0, 0.0, radio, riesgo, destruirenmuerte)
endfunction

function COR_XYCircularC takes real x, real y, real radio, real riesgo returns integer
return CrearObjetodeRiesgo(T_POSICIONCIRCULARCUADRATICA, null, x, y, 0.0, 0.0, radio, riesgo, false)
endfunction

function COR_XYCircularE takes real x, real y, real radio, real riesgo returns integer
return CrearObjetodeRiesgo(T_POSICIONCIRCULAREXPONENCIAL, null, x, y, 0.0, 0.0, radio, riesgo, false)
endfunction

function COR_XYCircularG takes real x, real y, real radio, real riesgo returns integer
return CrearObjetodeRiesgo(T_POSICIONCIRCULARGAUSSIANA, null, x, y, 0.0, 0.0, radio, riesgo, false)
endfunction

function COR_UnidadConicaG takes unit u, real apertura, real radio, real riesgo, boolean destruirenmuerte returns integer
return CrearObjetodeRiesgo(T_UNIDADCONICAGAUSSIANA, u, 0.0, 0.0, 0.0, apertura, radio, riesgo, destruirenmuerte)
endfunction

function COR_XYConicaG takes real x, real y, real angulo, real apertura, real radio, real riesgo returns integer
return CrearObjetodeRiesgo(T_POSICIONCONICAGAUSSIANA, null, x, y, angulo, apertura, radio, riesgo, false)
endfunction
//FUNCIONES CREADORAS

//FUNCIONES DE RIESGO
//Auxiliares
private function SumarRiesgo takes real riesgo returns nothing
set Riesgo = Riesgo + riesgo
endfunction

private function RiesgoCuadraticoCircular takes real xP, real yP, real radio, real riesgo returns nothing
local real x = xP-xRisk
local real y = yP-yRisk
local real dist = (x*x+y*y)/(radio*radio)//Cuadrado(wwModulo(xP-xRisk, yP-yRisk)/radio)
if dist < 1.0 then
call SumarRiesgo(riesgo*(1.0-dist))
endif
endfunction

private function RiesgoExponencialCircular takes real xP, real yP, real radio, real riesgo returns nothing
local real dist = wwModulo(xP-xRisk, yP-yRisk)/radio
if dist < 8.0 then
call SumarRiesgo(riesgo*(Pow(bj_E, -dist)))
endif
endfunction

private function RiesgoGaussianoCircular takes real xP, real yP, real radio, real riesgo returns nothing
local real dist = wwModulo(xP-xRisk, yP-yRisk)
local real c = 2*Cuadrado(radio)
if dist/radio < 3.0 then
call SumarRiesgo(riesgo*Pow(bj_E, -(Cuadrado(dist)/c)))
endif
endfunction

private function AnguloALaIzq takes real angulo, real referencia returns boolean
local boolean Izq = FALSE
if referencia < bj_PI then
if angulo > referencia and angulo <= referencia+bj_PI then
set Izq = true
endif
else
if not(angulo <= referencia and angulo > referencia-bj_PI) then
set Izq = true
endif
endif
return Izq
endfunction

private function RiesgoGaussianoConico takes real xP, real yP, real angulo, real apertura, real radio, real riesgo returns nothing
local real x = xP-xRisk
local real y = yP-yRisk
local real CosA = Cos(angulo)
local real SinA = Sin(angulo)
local real dist = wwModulo(x, y)
local real c = 2*Cuadrado(radio)
local real cmin = SquareRoot(c/Cool
local real riesgoG = Pow(bj_E, -(Cuadrado(dist)/c))
local real riesgoX = (CosA*x +SinA*y)/cmin
local real riesgoY
local real riesgoTotal
if AnguloALaIzq(Atan2(y, x) ,angulo) then
set CosA = Cos(angulo+bj_PI/2)
set SinA = Sin(angulo+bj_PI/2)
else
set CosA = Cos(angulo-bj_PI/2)
set SinA = Sin(angulo-bj_PI/2)
endif
set riesgoY = -Cuadrado((CosA*x+SinA*y)/(cmin*apertura))
set riesgoTotal = riesgoG*(0.5+riesgoX+riesgoY)
if dist/radio < 5.0 and riesgoTotal > 0.0 then
call SumarRiesgo(0.8073*riesgo*SquareRoot(riesgoTotal))
endif
endfunction
//Fin Auxiliares
private function F_UNIDADCIRCULARCUADRATICA takes nothing returns boolean
local unit u = LoadUnitHandle(ObjetodeRiesgo, pI, R_UNIDAD)
call RiesgoCuadraticoCircular(GetUnitX(u), GetUnitY(u), LoadReal(ObjetodeRiesgo, pI, R_DISTANCIA), LoadReal(ObjetodeRiesgo, pI, R_RIESGO))
set u = null
return FALSE
endfunction

private function F_UNIDADCIRCULAREXPONENCIAL takes nothing returns boolean
local unit u = LoadUnitHandle(ObjetodeRiesgo, pI, R_UNIDAD)
call RiesgoExponencialCircular(GetUnitX(u), GetUnitY(u), LoadReal(ObjetodeRiesgo, pI, R_DISTANCIA), LoadReal(ObjetodeRiesgo, pI, R_RIESGO))
set u = null
return FALSE
endfunction

private function F_UNIDADCIRCULARGAUSSIANA takes nothing returns boolean
local unit u = LoadUnitHandle(ObjetodeRiesgo, pI, R_UNIDAD)
call RiesgoGaussianoCircular(GetUnitX(u), GetUnitY(u), LoadReal(ObjetodeRiesgo, pI, R_DISTANCIA), LoadReal(ObjetodeRiesgo, pI, R_RIESGO))
set u = null
return FALSE
endfunction

private function F_POSICIONCIRCULARCUADRATICA takes nothing returns boolean
call RiesgoCuadraticoCircular(LoadReal(ObjetodeRiesgo, pI, R_X), LoadReal(ObjetodeRiesgo, pI, R_Y), LoadReal(ObjetodeRiesgo, pI, R_DISTANCIA), LoadReal(ObjetodeRiesgo, pI, R_RIESGO))
return FALSE
endfunction

private function F_POSICIONCIRCULAREXPONENCIAL takes nothing returns boolean
call RiesgoExponencialCircular(LoadReal(ObjetodeRiesgo, pI, R_X), LoadReal(ObjetodeRiesgo, pI, R_Y), LoadReal(ObjetodeRiesgo, pI, R_DISTANCIA), LoadReal(ObjetodeRiesgo, pI, R_RIESGO))
return FALSE
endfunction

private function F_POSICIONCIRCULARGAUSSIANA takes nothing returns boolean
call RiesgoGaussianoCircular(LoadReal(ObjetodeRiesgo, pI, R_X), LoadReal(ObjetodeRiesgo, pI, R_Y), LoadReal(ObjetodeRiesgo, pI, R_DISTANCIA), LoadReal(ObjetodeRiesgo, pI, R_RIESGO))
return FALSE
endfunction

private function F_UNIDADCONICAGAUSSIANA takes nothing returns boolean
local unit u = LoadUnitHandle(ObjetodeRiesgo, pI, R_UNIDAD)
call RiesgoGaussianoConico(GetUnitX(u), GetUnitY(u), bj_DEGTORAD*(GetUnitFacing(u)+180.0), LoadReal(ObjetodeRiesgo, pI, R_APERTURA), LoadReal(ObjetodeRiesgo, pI, R_DISTANCIA), LoadReal(ObjetodeRiesgo, pI, R_RIESGO))
set u = null
return FALSE
endfunction

private function F_POSICIONCONICAGAUSSIANA takes nothing returns boolean
call RiesgoGaussianoConico(LoadReal(ObjetodeRiesgo, pI, R_X), LoadReal(ObjetodeRiesgo, pI, R_Y), LoadReal(ObjetodeRiesgo, pI, R_ANGULO), LoadReal(ObjetodeRiesgo, pI, R_APERTURA), LoadReal(ObjetodeRiesgo, pI, R_DISTANCIA), LoadReal(ObjetodeRiesgo, pI, R_RIESGO))
return FALSE
endfunction
//FUNCIONES DE RIESGO

function ObtenerRiesgo takes real xP, real yP returns real
local integer maximo = LoadInteger(ObjetodeRiesgo, -1, 0)
set xRisk = xP
set yRisk = yP
set pI = 1
set Riesgo = Base
loop
exitwhen pI > maximo
call TriggerEvaluate(Funciones[LoadInteger(ObjetodeRiesgo, pI, R_TIPO)])
set pI = pI + 1
endloop
return Riesgo
endfunction

function DerivadaDireccionalEpsilon takes real x, real y, real epsilon returns real
local real epsilon_2 = epsilon*2.0
local real dx = ObtenerRiesgo(x + epsilon,y) - ObtenerRiesgo(x - epsilon,y) + 0.67*(ObtenerRiesgo(x + epsilon_2,y) - ObtenerRiesgo(x - epsilon_2,y))
local real dy = ObtenerRiesgo(x,y + epsilon) - ObtenerRiesgo(x,y - epsilon) + 0.67*(ObtenerRiesgo(x,y + epsilon_2) - ObtenerRiesgo(x,y - epsilon_2))
local real mod = wwModulo(dx, dy)
local real angulo = ERROR
if mod > 0.0 then
set angulo = Atan2(dy,dx)
else
set dx = 0.0
set dy = 0.0
endif
return angulo
endfunction

function DerivadaDireccionalEpsilonTriplePrecision takes real x, real y, real epsilon returns real
local real epsilon_2 = epsilon*2.0
local real epsilon_3 = epsilon*3.0
local real dx = ObtenerRiesgo(x + epsilon,y) - ObtenerRiesgo(x - epsilon,y) + 0.67*(ObtenerRiesgo(x + epsilon_2,y) - ObtenerRiesgo(x - epsilon_2,y)) + 0.33*(ObtenerRiesgo(x + epsilon_3,y) - ObtenerRiesgo(x - epsilon_3,y))
local real dy = ObtenerRiesgo(x,y + epsilon) - ObtenerRiesgo(x,y - epsilon) + 0.67*(ObtenerRiesgo(x,y + epsilon_2) - ObtenerRiesgo(x,y - epsilon_2)) + 0.33*(ObtenerRiesgo(x,y + epsilon_3) - ObtenerRiesgo(x,y - epsilon_3))
local real mod = wwModulo(dx, dy)
local real angulo = ERROR
if mod > 0.0 then
set angulo = Atan2(dy,dx)
else
set dx = 0.0
set dy = 0.0
endif
return angulo
endfunction

function DerivadaDireccional takes real x, real y returns real
return DerivadaDireccionalEpsilon(x, y, 30.0)
endfunction

function CambiarBase takes real base returns nothing
set Base = base
endfunction

function IniciarRIESGO takes real base returns nothing
if RiesgoIniciado == false then
set RiesgoIniciado = true
call CambiarBase(base)
call EnableTrigger(Muerte)
endif
endfunction

private function Muerte_C takes nothing returns boolean
return LoadInteger(ObjetodeRiesgo, -2, GetHandleId(GetTriggerUnit())) != 0
endfunction

private function Muerte_A takes nothing returns nothing
call DestruirObjetodeRiesgo(LoadInteger(ObjetodeRiesgo, -2, GetHandleId(GetTriggerUnit())))
endfunction

private function OnInit takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(Muerte, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(Muerte, Condition(function Muerte_C))
call TriggerAddAction(Muerte, function Muerte_A)
call DisableTrigger(Muerte)
//Funciones
set Funciones[T_UNIDADCIRCULARCUADRATICA] = CreateTrigger()
set Funciones[T_UNIDADCIRCULAREXPONENCIAL] = CreateTrigger()
set Funciones[T_UNIDADCIRCULARGAUSSIANA] = CreateTrigger()
set Funciones[T_POSICIONCIRCULARCUADRATICA] = CreateTrigger()
set Funciones[T_POSICIONCIRCULAREXPONENCIAL] = CreateTrigger()
set Funciones[T_POSICIONCIRCULARGAUSSIANA] = CreateTrigger()
set Funciones[T_UNIDADCONICAGAUSSIANA] = CreateTrigger()
set Funciones[T_POSICIONCONICAGAUSSIANA] = CreateTrigger()
call TriggerAddCondition(Funciones[T_UNIDADCIRCULARCUADRATICA], Condition(function F_UNIDADCIRCULARCUADRATICA))
call TriggerAddCondition(Funciones[T_UNIDADCIRCULAREXPONENCIAL], Condition(function F_UNIDADCIRCULAREXPONENCIAL))
call TriggerAddCondition(Funciones[T_UNIDADCIRCULARGAUSSIANA], Condition(function F_UNIDADCIRCULARGAUSSIANA))
call TriggerAddCondition(Funciones[T_POSICIONCIRCULARCUADRATICA], Condition(function F_POSICIONCIRCULARCUADRATICA))
call TriggerAddCondition(Funciones[T_POSICIONCIRCULAREXPONENCIAL], Condition(function F_POSICIONCIRCULAREXPONENCIAL))
call TriggerAddCondition(Funciones[T_POSICIONCIRCULARGAUSSIANA], Condition(function F_POSICIONCIRCULARGAUSSIANA))
call TriggerAddCondition(Funciones[T_UNIDADCONICAGAUSSIANA], Condition(function F_UNIDADCONICAGAUSSIANA))
call TriggerAddCondition(Funciones[T_POSICIONCONICAGAUSSIANA], Condition(function F_POSICIONCONICAGAUSSIANA))
endfunction

endlibrary[/JASS]

Para romper un poco con los tecnicismos pueden ver el siguiente mapa de ejemplo donde se ve el sistema en funcionamiento para crear una AI para un héroe.
El héroe tiende a moverse cerca del centro del mapa porque le hice considerar a través del sistema que allí existe menos riesgo.

 Material oculto 
  

ESTE SISTEMA NO ESTA TERMINADO, sin embargo como por fin decidí sacarlo del código local de mis bosses para ponerlo en una librería publico lo que tengo hasta ahora.


and it makes me wonder...


Última edición por WonderWoman el Lun Ene 13, 2014 1:45 am, editado 2 veces (Razón : Version 1.0c)
Volver arriba Ir abajo
MuSe

MuSe


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 219
Reputación Reputación : 46
Monedas de oro : 2590
Monedas de Platino : 5 [System] RIESGO Empty

Inventario :
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10

[System] RIESGO Empty
Mensaje(#) Tema: Re: [System] RIESGO [System] RIESGO Clock10Dom Ene 12, 2014 9:23 pm

Excelente Wink lo voy a probar, no entiendo nada.. pero lo voy a probar jaja.

WW me das miedo cuando se trata de matemáticas xD.
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 [System] RIESGO Empty

Inventario :
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10

[System] RIESGO Empty
Mensaje(#) Tema: Re: [System] RIESGO [System] RIESGO Clock10Lun Ene 13, 2014 12:18 am

Es verdaderamente interesante, excelente trabajo WW. Una adición que vendría bien es que automáticamente al lanzar una habilidad, si el punto de casteo de la misma se encuentra peligrosamente cerca, que agregue un radio donde no debe ir (al menos por un tiempo, lo cual puede hacerse fácilmente haciendo uso de dummies, agregándoles tiempo de vida) ya agregado en los ejemplos no lo había visto.

Esto podria hacerse directamente en init:

[jass]       call IniciarFuncion(T_UNIDADCIRCULARCUADRATICA, Condition(function F_UNIDADCIRCULARCUADRATICA))
       call IniciarFuncion(T_UNIDADCIRCULAREXPONENCIAL, Condition(function F_UNIDADCIRCULAREXPONENCIAL))
       call IniciarFuncion(T_UNIDADCIRCULARGAUSSIANA, Condition(function F_UNIDADCIRCULARGAUSSIANA))
       call IniciarFuncion(T_POSICIONCIRCULARCUADRATICA, Condition(function F_POSICIONCIRCULARCUADRATICA))
       call IniciarFuncion(T_POSICIONCIRCULAREXPONENCIAL, Condition(function F_POSICIONCIRCULAREXPONENCIAL))
       call IniciarFuncion(T_POSICIONCIRCULARGAUSSIANA, Condition(function F_POSICIONCIRCULARGAUSSIANA))
       call IniciarFuncion(T_UNIDADCONICAGAUSSIANA, Condition(function F_UNIDADCONICAGAUSSIANA))
       call IniciarFuncion(T_POSICIONCONICAGAUSSIANA, Condition(function F_POSICIONCONICAGAUSSIANA))[/jass]

Recomendaría el uso de structs (legibilidad, facilidad). Mucho hashtable marea y tiende a producir errores humanos por esto.

Simplemente muy bueno, +rep.

Saludos.

P.D.: Por cierto, el mapa no compila (faltan 2 call en INICIO y mover declaraciones de variable arriba).

edit: Alternativo para spells en general:

[gui]OnCast
   Events
       Unit - A unit Begins casting an ability
       Unit - A unit Begins channeling an ability
   Conditions
   Actions
       Set p1 = (Target point of ability being cast)
       Unit - Create 1 Wisp for (Owner of (Triggering unit)) at p1 facing Default building facing degrees
       Custom script:   call RemoveLocation(udg_p1)
       Unit - Add a 3.00 second Water Elemental expiration timer to (Last created unit)
       Custom script:   call COR_UnidadCircularG(GetLastCreatedUnit(), 150.0, 100.0, true)
[/gui]
Volver arriba Ir abajo
WonderWoman
Capitán
WonderWoman


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 129
Reputación Reputación : 28
Monedas de oro : 830
Monedas de Platino : 0 [System] RIESGO Empty

Inventario :
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10

[System] RIESGO Empty
Mensaje(#) Tema: Re: [System] RIESGO [System] RIESGO Clock10Lun Ene 13, 2014 1:02 am

@Sauron escribió:

Esto podria hacerse directamente en init:

[jass]       call IniciarFuncion(T_UNIDADCIRCULARCUADRATICA, Condition(function F_UNIDADCIRCULARCUADRATICA))
       call IniciarFuncion(T_UNIDADCIRCULAREXPONENCIAL, Condition(function F_UNIDADCIRCULAREXPONENCIAL))
       call IniciarFuncion(T_UNIDADCIRCULARGAUSSIANA, Condition(function F_UNIDADCIRCULARGAUSSIANA))
       call IniciarFuncion(T_POSICIONCIRCULARCUADRATICA, Condition(function F_POSICIONCIRCULARCUADRATICA))
       call IniciarFuncion(T_POSICIONCIRCULAREXPONENCIAL, Condition(function F_POSICIONCIRCULAREXPONENCIAL))
       call IniciarFuncion(T_POSICIONCIRCULARGAUSSIANA, Condition(function F_POSICIONCIRCULARGAUSSIANA))
       call IniciarFuncion(T_UNIDADCONICAGAUSSIANA, Condition(function F_UNIDADCONICAGAUSSIANA))
       call IniciarFuncion(T_POSICIONCONICAGAUSSIANA, Condition(function F_POSICIONCONICAGAUSSIANA))[/jass]
Cierto, ahora lo muevo a Init

@Sauron escribió:

Recomendaría el uso de structs (legibilidad, facilidad). Mucho hashtable marea y tiende a producir errores humanos por esto.
Algún día, pero por ahora no, déjenme con mis queridas hashtables...

@Sauron escribió:

P.D.: Por cierto, el mapa no compila (faltan 2 call en INICIO y mover declaraciones de variable arriba).
Eso es porque el UMSWE no necesita que ponga los call, set y esas cosas un problema de mi compilador que es flexible en la sintaxis, ahora lo corrijo.

@Sauron escribió:

edit: Alternativo para spells en general:

[gui]OnCast
   Events
       Unit - A unit Begins casting an ability
       Unit - A unit Begins channeling an ability
   Conditions
   Actions
       Set p1 = (Target point of ability being cast)
       Unit - Create 1 Wisp for (Owner of (Triggering unit)) at p1 facing Default building facing degrees
       Custom script:   call RemoveLocation(udg_p1)
       Unit - Add a 3.00 second Water Elemental expiration timer to (Last created unit)
       Custom script:   call COR_UnidadCircularG(GetLastCreatedUnit(), 150.0, 100.0, true)
[/gui]
Seee, es lo que normalmente hago en realidad :p


and it makes me wonder...
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 [System] RIESGO Empty

Inventario :
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10

[System] RIESGO Empty
Mensaje(#) Tema: Re: [System] RIESGO [System] RIESGO Clock10Lun Ene 13, 2014 9:32 am

Citación :
Algún día, pero por ahora no, déjenme con mis queridas hashtables...

Spoiler:
 

Te vas a confundir entre tantos índices  e.e ...

Sugerencia: estaría bueno que se pueda obtener el objetivo que tiene actualmente la AI y/o de generar uno nuevo en caso de haber uno mas debilitado.
Volver arriba Ir abajo
WonderWoman
Capitán
WonderWoman


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 129
Reputación Reputación : 28
Monedas de oro : 830
Monedas de Platino : 0 [System] RIESGO Empty

Inventario :
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10

[System] RIESGO Empty
Mensaje(#) Tema: Re: [System] RIESGO [System] RIESGO Clock10Lun Ene 13, 2014 12:10 pm

@Sauron escribió:
Sugerencia: estaría bueno que se pueda obtener el objetivo que tiene actualmente la AI y/o de generar uno nuevo en caso de haber uno mas debilitado.

En realidad no pretendo hacer una librería de AI en general, lo cual estaría bueno pero escapa al alcance del sistema de riesgo, es mas primero debería mejorar este sistemita antes de pensar en algo que abarque mas aspectos de una AI.
PD: fijate si compila ahora jaja.


and it makes me wonder...
Volver arriba Ir abajo
TRISTAN
Caballero
TRISTAN


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 297
Reputación Reputación : 63
Monedas de oro : 1791
Monedas de Platino : 3 [System] RIESGO Empty

Inventario :
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10

[System] RIESGO Empty
Mensaje(#) Tema: Re: [System] RIESGO [System] RIESGO Clock10Dom Nov 30, 2014 3:25 pm

Permiso me llevo esto para hecharle un ojo encima.. estoy con ganas de leer Very Happy


[System] RIESGO 20uevxy
Valar Morghulis|Mis aportes|
Volver arriba Ir abajo
Trigger.edge

Trigger.edge


Barra de Salud : Este usuario es invulnerable ¿Será que es fiel a las normas?

Mensajes Mensajes : 978
Reputación Reputación : 111
Monedas de oro : 1245
Monedas de Platino : 0 [System] RIESGO Empty

Inventario :
Cetro del Rey Armadura Mágica Daga Mística
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10

[System] RIESGO Empty
Mensaje(#) Tema: Re: [System] RIESGO [System] RIESGO Clock10Dom Nov 30, 2014 7:11 pm

@TRISTAN escribió:
Permiso me llevo esto para hecharle un ojo encima.. estoy con ganas de leer Very Happy

Interesado en aprender Jass? eso es bueno....


[System] RIESGO Wc3scr10
Volver arriba Ir abajo
TRISTAN
Caballero
TRISTAN


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 297
Reputación Reputación : 63
Monedas de oro : 1791
Monedas de Platino : 3 [System] RIESGO Empty

Inventario :
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10

[System] RIESGO Empty
Mensaje(#) Tema: Re: [System] RIESGO [System] RIESGO Clock10Dom Nov 30, 2014 11:12 pm

si.. he estado viendo unas cosas pero no he arrancado. tiene algunas cosas diferentess. la estructura y formacion de trigger, scope.. todo eso mas o menos lo q es el funcionamiento lo entiendo todo me falta practica.. y conociendo a wonder se qe todo lo que el hace es buen ejemplo. y asi me ha ido cn las cosas que ha aportado para GUI..


[System] RIESGO 20uevxy
Valar Morghulis|Mis aportes|
Volver arriba Ir abajo
Trigger.edge

Trigger.edge


Barra de Salud : Este usuario es invulnerable ¿Será que es fiel a las normas?

Mensajes Mensajes : 978
Reputación Reputación : 111
Monedas de oro : 1245
Monedas de Platino : 0 [System] RIESGO Empty

Inventario :
Cetro del Rey Armadura Mágica Daga Mística
[System] RIESGO Empysl10 [System] RIESGO Empysl10 [System] RIESGO Empysl10

[System] RIESGO Empty
Mensaje(#) Tema: Re: [System] RIESGO [System] RIESGO Clock10Dom Nov 30, 2014 11:23 pm

Dicho esto y si en verdad quieres empezar me motivare a crear un mini tutorial, que seria mas q todo el método que yo use para empezar (y me sirvió mucho).... Bueno ya no desvirtuemos el tema xD


[System] RIESGO Wc3scr10
Volver arriba Ir abajo
Contenido patrocinado




[System] RIESGO Empty
Mensaje(#) Tema: Re: [System] RIESGO [System] RIESGO Clock10

Volver arriba Ir abajo
 

[System] RIESGO

Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 1 de 1.

 Temas similares

-
» Precios de las cartas
» 4D system y Zero G

Permisos de este foro:No puedes responder a temas en este foro.
Warcraft III - WorldEditor :: Aportes :: Librerías-