Clan DLAN
Herramientas personales
Clan DLAN
Clan DLAN
Clan DLAN
Clan DLAN
Clan DLAN

Tutorial Fallout 3 Creando nuevos objetos II - Efectos

De Videojuegos

Este tutorial, aunque pretende ser una continuación del tutorial Creando nuevos objetos con GECK, puede ser seguido de forma independiente. Está dividido en secciones independientes pero en algunos casos no compatibles entre sí (algunos efectos están pensados para armas y otros para armaduras). Los últimos niveles tratan sobre efectos complejos aplicados con un Script, y para poder comprenderlos necesitarás algunos conocimientos básicos o avanzados de scripting (aquí tienes un tutorial básico sobre Scripts traducido al español). Este tutorial asume que ya tienes un arma o armadura escogida para aplicar los efectos y que dispones asimismo de conocimientos sobre el programa GECK.

NOTA: TUTORIAL NO TERMINADO. DISCULPAS POR LAS MOLESTIAS.


Contenido

ROPA: CUBRIRSE CON OBJETOS

El primer efecto que vamos a ver tratará de darle algo más de gracia a la ropa cómoda del juego. Puesto que ya da +1 a Agilidad, asumo que es ropa casi deportiva, y le añadiremos el efecto de aumentar la resistencia al daño pero SOLO cuando el actor tenga un objeto "agarrado" con la tecla Z (por defecto).

En GAME EFFECTS--OBJECT EFFECT abrimos el "encantamiento" EnchClothingComfortable y añadimos el efecto IncreaseDamageResistance con Magnitude 20 con botón derecho y New al panel Effects.


3ResDamage.jpg


(NOTA: la traducción al español no les ha quedado muy fina en este caso...)

Abrimos el efecto (doble clic) añadimos una nueva condición con botón derecho y New en el panel Conditions. La condición será IsPlayerActionActive, que tiene posibilidades muy interesantes (ver más abajo). En Function Parameters ponemos 5 (muy importante). En Comparison lo dejamos por dejecto (==) y en Value ponemos 1. Para el apartado Run on podría funcionar Subject como objeto de comparación, y sería el portador del traje, pero recomiendo usar Reference y Player porque la función que vamos a utilizar solo se puede aplicar sobre el jugador, y podría crear conflictos extraños si es llamado sobre otro actor. Ante la duda, mejor prevenir.


4condition.jpg


5player.jpg


Y listos. Ahora cuando el actor lleve la Ropa Cómoda le añadirá un 20 a su resistencia al daño si mantiene un objeto "agarrado" con la tecla Z. La idea es dar la impresión de que te puedes cubrir con objetos. La función IsPlayerActionActive es una incorporación nueva al GECK. Tiene una pequeña lista de parámetros para varias acciones y probablemente es usada por el juego para activar los diálogos de respuesta al jugador con determinadas acciones. Esta es la lista de parámetros:


   * 1 = MOVER UN ARMA DE CUERPO A CUERPO
   * 2 = LANZAR UNA GRANADA
   * 3 = DISPARAR UN ARMA
   * 4 = PLANTAR UNA MINA
   * 5 = USAR LA TECLA "Z"
   * 6 = SALTAR
   * 7 = GOLPEAR OBJETOS
   * 8 = ESTAR SOBRE UNA MESA O SILLA
   * 9 = APUNTAR O MANTENER UN ARMA DESENFUNDADA
   * 10 = DESTRUIR OBJETO

--Bauhaus 11:16 25 may 2009 (UTC)


ARMADURA: CONDICIONES EXCLUYENTES

Al condicionar un efecto podemos crear múltiples condiciones que sean contradictorias entre sí. Esto quiere decir de debemos ser muy cuidadosos en nuestra planificación para que los diferentes efectos no se sobrepongan unos sobre otros. Por ejemplo, podemos crear diferentes niveles de efectos para una Servoarmadura (por ejemplo) basándonos en la habilidad Ciencia del jugador:

-Con Ciencia inferior o igual a 40: -2 en Agilidad y +10 en Resistencia a la Radiación.

-Con Ciencia superior a 40 pero inferior o igual a 80: -1 en Agilidad y +20 Resistencia a la Radiación.

-Con Ciencia superior a 80: elimino la penalización a la agilidad, +25 en Resistencia a la Radiación y +5 al Daño Desarmado.

Vamos allá. En GAME EFFECTS--OBJECT EFFECT abrimos el "encantamiento" que queremos aplicar a nuestra armadura. En mi caso abriré en de todas las Servoarmaduras, EnchPowerArmor.

Lo primero que hacemos es crear TODOS los efectos que tendrá la armadura. De esta forma tendremos nuestro trabajo organizado. Esta es la lista de efectos que añadimos con botón derecho y New sobre el panel Effects:

-ReduceAgility. Con Magnitude 1. -IncreaseRadiationResistance. Con Magnitude 20. -IncreaseRadiationResistance. Con Magnitude 25. -IncreasedUnArmedDamage. Con Magnitude 5.


0Lista.jpg


Vamos a añadir la primera condición. Abro el efecto Menos Agilidad de magnitud 2 y botón derecho en el panel Conditions y New. Le añado los siguentes parámetros y valores:

GetActorValue-- en Parameter Science-- en Conparision (<=)-- y en Value 40. Lo más importante ahora es especificar en el apartado Run on sobre quien se debe hacer esta comparacion, y tenemos dos opciones: podemos usar Subject para que sea el portador de la armadura el objeto de comparación, o podemos especificar la referencia Player con Reference para que sea solo sobre el judador. Cualquiera de los dos métodos es valido, aunque el primero hará que cualquiera pueda tener estos efectos. Le damos a Ok y ya tenemos lista la primera condición.


1ciencia40.jpg


Las condiciones se pueden pegar de un efecto a otro con botón derecho y Copy Condition. Es lo que hago para pegar esta condición sobre el panel Conditions del efecto IncreaseRadiationResistance de valor 10. Ahora la agilidad y la resistencia a la radiación deberían activarse solo cuando el jugador (o quien lleva la armadura) tenga menos de 40 en Ciencia.

Seguimos. Abro el efecto Menos Agilidad de magnitud 1 y creo la siguiente condición:

GetActorValue-- en Parameter Science-- en Conparision (>)-- y en Value 40. En Run on ponemos Subject o Reference-Player dependiendo de lo que hiciéramos antes.

Y acto seguido añado OTRA condición, (o bien duplico con botón derecho Duplicate la condición existente) con estos valores:

GetActorValue-- en Parameter Science-- en Conparision (<=)-- y en Value 80. En Run on ponemos Subject o Reference-Player.


2cond.jpg


Ahora copia estas condiciones (con botón derecho Copy all conditions) al panel Conditions del efecto Más resistencia a la rediación de valor 20.

Para terminar creo la siguiente condición a los efectos Más resistencia a la rediación de valor 25 y Más daños desarmado:

GetActorValue-- en Parameter Science-- en Conparision (>)-- y en Value 80. En Run on ponemos Subject o Reference-Player dependiendo de lo que hiciéramos antes.

(Copia o crea la candición en cada uno de los efectos con los mismos métodos que ya hemos utilizado anteriormente)

Si nos fijamos bien, cuando el actor que lleve la armadura tenga un nivel de Ciencia superior a 81 no tendrá ninguna penalización a la agilidad porque las condiciones que hemos creado para estos efectos son para Ciencia inferior a 40 y Ciencia entre 41 y 80.

Y hemos terminado. Las condiciones excluyentes nos permiten aplicar un efecto sin que se apliquen los demás, pero para ello hemos de ser muy cuidadosos. Si, por ejemplo, para la última condición en lugar de Ciencia > 80 ponemos Ciencia >= 80, podría darse la circunstancia de que se apliquen este efecto y el anterior si la ciencia del actor es justo igual a 80.

--Bauhaus 11:15 25 may 2009 (UTC)


ARMADURA: REGENERACIÓN. Creación de un script para un objeto

Con la expansión Anchorage se incluyeron algunos objetos y Scripts que no fueron utilizados en el juego. Uno de ellos es un efecto de regeneración para salud y miembros amputados. Se trata de un Script y nosotros vamos a crear uno nuevo basándonos en este código, lo que nos permitirá modificar a placer el efecto, y ademas.

Este efecto se aplicará a nuestra armadura directamente como un Script, y no como un efecto.

Lo primero que debemos hacer es crear un nuevo Script de nombre (por ejemplo) RegeneracionScript y copiar dentro el código del Script testPhilRegenArmorSCRIPT que se encuentra en MISCELLANEOUS-SCRIPT de la ventana Object Window si tienes Anchorage cargado como un archivo master. Si este no es el caso puedes limitarte a copiar el código que tienes justo debajo. NOTA IMPORTANTE: el Script debe ser de tipo Object.

Este es el código del Script testPhilRegenArmorSCRIPT:

scn testPhilRegenArmorSCRIPT

short armorEquipped

short regenTimer
short timerRunning

short regenAmountHP
short regenAmountLimbs

BEGIN ONEQUIP
	set armorEquipped to 1
	set regenAmountHP to 15
	set regenAmountLimbs to 100

END

BEGIN ONUNEQUIP
	set armorEquipped to 0
END

BEGIN GAMEMODE

	IF armorEquipped == 1 && player.isInCombat == 0 && player.getHealthPercentage < 1.0
		
		IF timerRunning == 0 
			set regenTimer to 150
			set timerRunning to 1

		ELSE			
			
			IF regenTimer > 0
				set regenTimer to regenTimer - getSecondsPassed
			ELSE

				player.restoreAv Health regenAmountHP
				player.restoreAv LeftMobilityCondition regenAmountLimbs
				player.restoreAv RightMobilityCondition regenAmountLimbs
				player.restoreAv LeftAttackCondition regenAmountLimbs
				player.restoreAv RightAttackCondition regenAmountLimbs
				player.restoreAv PerceptionCondition regenAmountLimbs
				player.restoreAv EnduranceCondition regenAmountLimbs
				set timerRunning to 0
			ENDIF

		ENDIF		
	ENDIF

END

Este código hace que cada 150 segundos el jugador regenere 15 de salud y 100 de los miembros amputados. Estos valores pueden ser cambiados a placer modificando los valores a los que serán configuradas las variables regenAmountHP (salud) regenAmountLimbs (miembros) y regenTimer (temporizador).

En nuestro ejemplo dejaré esto por defecto, pero añadiré unas condiciones para que el código solo se ejecute a la luz del sol. Para ello usaré los comandos IsInInterior y GameHour.

Así ha quedado el código:

scn RegeneracionSCRIPT

short armorEquipped

short regenTimer
short timerRunning

short regenAmountHP
short regenAmountLimbs

BEGIN ONEQUIP
	set armorEquipped to 1
	set regenAmountHP to 15
	set regenAmountLimbs to 100

END

BEGIN ONUNEQUIP
	set armorEquipped to 0
END

BEGIN GAMEMODE

	If IsInInterior == 0 && GameHour > 6 && GameHour < 18 && armorEquipped == 1
		if player.isInCombat == 0 && player.getHealthPercentage < 1.0
			if timerRunning == 0 
				set regenTimer to 150
				set timerRunning to 1
			else			
				if regenTimer > 0
					set regenTimer to regenTimer - getSecondsPassed
				else
					player.restoreAv Health regenAmountHP
					player.restoreAv LeftMobilityCondition regenAmountLimbs
					player.restoreAv RightMobilityCondition regenAmountLimbs
					player.restoreAv LeftAttackCondition regenAmountLimbs
					player.restoreAv RightAttackCondition regenAmountLimbs
					player.restoreAv PerceptionCondition regenAmountLimbs
					player.restoreAv EnduranceCondition regenAmountLimbs
					set timerRunning to 0
				endif
			endif		
		endif
	endif

END

Salvamos nuestro Script y abrimos nuestra armadura o ropa. En la pestaña Script debemos seleccionar el nuestro. Si no aparece es o bien porque el Script no ha sido guardado o bien porque no es del tipo Object.

Y hemos terminado. Usar Scripts en objetos da, probablemente, las mayores posibilidades del GECK. Nuestro ejemplo es sencillo porque hemos utilizado un código ya existente, pero eso no significa que no podamos crear infinidad de efectos usando programación y una buena planificación.


6ArmorScript.jpg


NOTA OPCIONAL: aunque los Script que figuran arriba son perfectamente funcionales y no van a causar ningún problema, debemos ser más limpios al programar.

Hacer esto...

If IsInInterior == 0 && GameHour > 6 && GameHour < 18
	;algo ocurre
endif

...hace que el ordenador chequee las tres condiciones sin importar si alguna se cumple o no.

Por tanto, esto...

If IsInInterior == 0
	GameHour > 6
		GameHour < 18
			;algo ocurre
		endif
	endif
endif

...hará que el ordenador sea más efectivo, porque no revisará GameHour hasta que IsInInterior no sea cierto.

No he escrito correctamente los códigos que figuran arriba por simple cuestión estética y de facil lectura, puesto que algunas lineas salían de la caja de código al ser muy largas.

--Bauhaus 11:14 25 may 2009 (UTC)


ARMA ELECTRICA I: utilizando Críticos para aplicar efectos

NOTA: los siguientes efectos son parte de una posible arma electrica. Pueden hacerse por separado aunque están pensados para usarse en conjunto.


Un interesante método para añadir efectos es configurar un Script como un Crítico y utilizar las variables que tienen adjudicadas. De esta forma, además de hacer un efecto personalizado con nuestro código podemos, en cualquier momento y sin abrir el Script, cambiar el daño o la probabilidad de que ocurra ese efecto.

Lo primero que haremos será crear el Script. En MISCELLANEOUS--SCRIPT creamos uno nuevo. El efecto que buscamos es añadir una explosión fuerte cuando nuestra arma golpee a un robot. Algo parecido a la explosión de un generador al ser disparado. Nuestro Script necesita tres cosas:

1. Añadir una explosión en la posición del objetivo.

2. Que solo afecte a los robots.

3. Subir un poco el centro de la explosión para que de la impresión de que es el pecho del robot el que explota, y no sus piernas.

Para todo ello vamos a usar los comandos GetIsCreatureType, GetPos y PlaceAtMe.

Nombramos el Script, lo configuramos como de tipo Effect, y creamos el bloque GameMode y nuestra primera condición, para que solo afecte a los robots. Si vemos el listado de parámetros para GetIsCreatureType descubrimos que el específico de los robots es el 6.

ScriptName RobotExplosionScript

Begin ScriptEffectStart
	If GetisCreatureType 6 == 1

	endif
End

Y ahora creamos la explosión. Nosotros usaremos la misma que utilizan los generadores eléctricos del juego al ser disparados. Para ello necesitamos crear una referencia donde guardaremos la explosión, y acto seguido mover la referencia a una variable flotante que es donde queramos que esté, es decir, donde esté el robot, pero un poco más arriba (si no explotará a sus pies).

ScriptName RobotExplosionScript

ref RobotTarget
float ZposRob

Begin ScriptEffectStart
	If GetisCreatureType 6 == 1
		set RobotTarget to PlaceAtMe ElectricBoxExplosion 1 ;almacena la explosión
		set ZposRob to ( RobotTarget.getpos Z ) + 60 ;prepara un marcador 
		RobotTarget.setpos z ZposRob ;mueve la explosión al marcador
	endif
End

Y ya está. Fijaros que en la posición Z he sumado 60 para que está un poco por encima del suelo. Guardamos nuestro Script y nos vamos a GAME EFFECTS--BASE EFFECTS. Aquí creamos nuestro efecto base con botón derecho New. Ponedle un ID claro y conciso, configurarlo como se ve en la imágen (aunque algunos de los marcadores probablemente no sean necesarios) y lo más importante, que el arquetipo sea de Script (en concreto del que acabamos de crear).


8BaseEffect.jpg


Pero esto no es suficiente. Este efecto se podrá ver ahora en la ventana Object Effect como RobotExplosionScriptEffect, y si lo aplicamos a un arma tal cual está siempre que golpeemos a un robot este explotará. Lo que nosotros buscamos en realidad es vincular la explosión a los críticos de un arma y configurarlo para que solo ocurran a la muerte del robot. Por tanto debemos crear un efecto Crítico usando el efecto RobotExplosionScriptEffect-Electric Shock.

Vamos a GAME EFFECTS--ACTOR EFFECT---ACTOR EFFECT y creamos un nuevo efecto (botón derecho y New). Los valores como se muestran en la imagen, y en el panel Effects creamos un nuevo efecto RobotExplosionScriptEffect.


9Actor Effect.jpg


Ya tenemos el Crítico preparado. Ahora vamos a vincularlo a nuestra arma. Abrimos nuestra arma y en la ventana Weapon, abajo a la izquierda encontramos los parámetros dedicados a los críticos.


7Critico.jpg


Crit % Mult es el multiplicador de tu probabilidad de un crítico. Si es 100, por ejemplo, nos aseguramos que siempre se aplique el efecto y el daño del crítico.

Crit Dmg es el daño, que por cierto, por reglas del juego ignora la resistencia del objetivo. Utilizad con precaución, porque puede resultar en un juego muy desajustado.

Crit Effect es donde escogemos el effecto para el crítico. En nuestro ejemplo TeslaShockRobot. Además debemos marcar la casilla On Death para que el efecto solo se aplique cuando el objetivo muera por nuestro disparo.

Y ya está. Si testeamos veremos que nuestro robot-victima en ocasiones explota furiosamente a la altura del pecho. Esta explosión causa daño y en el siguiente Efecto veremos como crear nuevas explosiones personalizadas.


NOTA IMPORTANTE: aquellos con conocimientos de scripting y sobretodo con experiencia en Oblivion habrán oido que el comando PlaceAtMe, usado excesivamente, puede sobrecargar las partidas salvadas, porque genera referencias que no son borradas por el juego y esto puede llegar a impedir que abras de nuevo tu partida.

En Fallout se puede utilizar el nuevo comando MarkForDelete para evitar esto pero en nuestro caso no es necesario, porque se ha comprobado que las explosiones no dejan ninguna referencia en el juego despues de usarse.



OPCIONAL: hay un último detalle que deberíamos pulir. Nuestro crítico afecta a TODOS los robots del juego, pero los OjoBots (EyeBots) ya tienen su propia explosión al morir. Sería muy adecuado excluirlos de nuestro efecto crítico.

Para ello, y como no existe un tipo de criatura llamado EyeBot debemos crear una lista donde incluirlos a todos.

Vamos a MISCELLANEOUS--FORM LIST y creamos una nueva lista llamada EyeBotLIST. Con la lista abierta debemos arrastrar dentro las referencias que queramos incluir. En nuestro caso todas ellas se encuentran en ACTORS--CREATURE--ROBOT--EYEBOT.


10list.jpg


Y con la lista ya preparada ahora debemos actualizar nuestro Script RobotExplosionScript con la función IsInList. De esta forma el código solo se activara si la criatura golpeada es un robot Y no está incluido en la lista EyeBotLIST.

Así nos quedará el código:

ScriptName RobotExplosionScript

ref RobotTarget
float ZposRob

Begin ScriptEffectStart
	If GetisCreatureType 6 == 1 && isinlist EyeBotLIST == 0
		set RobotTarget to PlaceAtMe ElectricBoxExplosion 1 ;almacena la explosión
		set ZposRob to ( RobotTarget.getpos Z ) + 60 ;prepara un marcador 
		RobotTarget.setpos z ZposRob ;mueve la explosión al marcador
	endif
End


--Bauhaus 11:14 25 may 2009 (UTC)


ARMA ELECTRICA II: script de nivel avanzado

El siguiente tutorial es una introducción a los efectos creados a partir de scripts de nivel medio o avanzado. Requiere conocimientos de Scripting para comprenderlo.

El efecto que buscamos es que dé la impresión de ser un rayo eléctrico con capacidad suficiente para, o bien empujar al objetivo, o bien hacer explotar la munición de su arma (con una explosión y dejando a cero el estado del arma afectada). Para todo ello usaremos pequeñas formulas para hacerlo aleatorio, y además limitaremos el efecto para que no actue sobre determinados actores. Muy probablemente no sea posible explotar munición con una descarga eléctrica en la vida real pero es un efecto interesante que queda muy en la linea de universo Fallout.

Es importante hacer notar que este tutorial SOLO cubre la creación del Script, y no de la malla del rayo ni del arma.

Para implementar el Script usaremos el método ya descrito anteriomente:

1.Creamos un script llamado TeslaRifleScript(por ejemplo) y de tipo Effect.

2.Creamos un Base Effect con la ID de TeslaRifleScriptEffect. El arquetipo debe ser de Script y las pestañas Self, Touch y Target deben estar marcadas. En Assoc. Item escogemos nuestro Script.

3.Y por último creamos un Object Effect para nuestra arma o usamos uno ya existente donde incluimos el efecto TeslaRifleScriptEffect.

En el presente tutorial se dará toda esta parte por hecha y solo nos centraremos en el script.



Empezamos. En primer lugar creamos el script con botón derecho y NEW en el apartado MISCELLANEOUS-SCRIPT. Es muy importante que marquemos el nuevo script como de tipo Effect. Si no lo hacemos no nos aparecerá más adelante.

Primero creamos el título, despues el bloque ScriptEffectStart (con un End al final) y acto seguido la referencia MySelf que debe estar configurada con el comando Getself. Esta almacenará la ID del actor golpeado por el efecto para poder usarlo más adelante.

ScriptName TeslaRifleScript

ref MySelf

Begin ScriptEffectStart
	set myself to getself
End

Ahora crearemos las primeras condiciones para el efecto de explotar armas. Haremos que el efecto se active SOLO si el actor golpeado NO es una criatura. Pero aquí tendremos un problema: en mi playtest del arma descubrí que algunos actores añadidos por mods aun siendo criaturas no figuran como tal dentro del juego. Es el caso, por ejemplo, de cierto Mirelurk lanzador de fuego del mod Marts Mutant Mod. Este es claramente una criatura, pero en realidad no lo es para poder así equiparse con un lanzallamas invisible (¿?).

Para evitar esto crearemos dos condiciones separadas por el comparador "O". Una preguntará si el actor no es una criatura y la otra preguntara si el actor es un supermutante. De esta forma si alguna de las dos condiciones es cierta, y aunque la otra no lo sea, el código siguiente se activará. Las funciones que utilizaremos serán GetIsCreature y GetIsCreatureType.

Por ejemplo, si el actor golpeado es un humano el código se activara porque NO ES UNA CRIATURA. Y si el actor es un Supermutante igualmente se activará AUNQUE SEA UNA CRIATURA. Esto será gracias al comparador "O" (que se define con "||").

ScriptName TeslaRifleScript

ref MySelf

Begin ScriptEffectStart
	set myself to getself
	If myself.getiscreature == 0 || myself.getiscreaturetype 4 == 1
End

(El parámetro que define a los supermutantes en el comando getiscreaturetype es 4.)

Ahora crearemos una condición sencilla para el máximo de distancia del efecto (3000, por ejemplo) con la función GetDistance y añadiremos la condición que busca el tipo de arma que usa el objetivo. Decido utilizar la función GetWeaponAnimType con el parámetro igual o mayor que 5. De esta forma solo explotarán las armas superiores a un rifle, incluidas las minas y granadas.

Aquí usaré un comparador "Y" en lugar del "O" del anterior caso.

ScriptName TeslaRifleScript

ref MySelf

Begin ScriptEffectStart
	set myself to getself
	If myself.getiscreature == 0 || myself.getiscreaturetype 4 == 1
		if myself.GetWeaponAnimType >= 5 && myself.GetDistance Player < 3000
End

Ahora crearemos una última condición que dará aleatoriedad al código. Creamos una variable short llamada DadoElectric y usamos la función GetRandomPercent para darle un valor aleatorio. Despues creamos otra variable short llamada ProbabilidadExp y la configuro con una sencilla ecuación que incluya la suerte del jugador y la suerte del actor golpeado:

5 + (la SUERTE del jugador multiplicada por 2) - (la SUERTE del Actor por 2)

Entonces hacemos una comparación entre estas dos variable: si la tirada aleatoria es menor que la probabilidad de explosión, entonces...

Veamos como queda:

ScriptName TeslaRifleScript

ref MySelf
short DadoElectric
short ProbabilidadExp

Begin ScriptEffectStart
	set myself to getself
	If myself.getiscreature == 0 || myself.getiscreaturetype 4 == 1
		if myself.GetWeaponAnimType >= 5 && myself.GetDistance Player < 3000
			set DadoElectric to getRandomPercent
			set ProbabilidadExp to ( 5 + ( player.GetAV luck * 2 ) - ( myself.GetAV luck * 2 ) )
			if DadoElectric < ProbabilidadExp 
End

Ahora la cosa se complica (¿Más?). En primer lugar todo esto lo hemos hecho porque sabemos que hay dos tipos de actores que pueden llevar armas si descontamos las rarezas de algún mod (de las que por cierto ya estamos precavidos). Son los humanos y los supermutantes. El primer problema es que tienen estaturas diferentes, y al situar la explosión para el arma tendremos que tener esto en cuenta. Usaremos la función GetIsCreatureType y el estamento Else para diferenciar un código de otro. Las explosiones creadas con el comando PlaceAtMe (que es el que usaremos) se situan por defecto en la posición cero del eje Z, es decir, en el suelo. A este valor le añadiremos 60 para los humanos y 105 para los supermutantes. De esta forma la explosión tendrá la altura correcta siempre.

Nuestro segundo problema es qué ocurre cuando el actor objetivo esté derribado en el suelo. Si no tenemos esto en cuenta la explosión de su arma podría ocurrir dos metros por encima suyo, lo que quitaría realismo al efecto. Para evitarlo usaremos la función IsFacingUp, que chequea si el objetivo bípedo está o no tirado en el suelo (esto es perfecto, porque no existe un cuadrúpedo que lleve armas en el juego). Si el actor está en el suelo solo se sumará 10 a la altura de la explosión, y si está de pie, 60 o 105 dependiendo de si es Humano o Supermutante.

Y nuestro tercer problema, y el más confuso, es que necesitamos marcar la posición exacta del objetivo, y después situar la explosión un poco hacia su derecha y un poco hacia delante, es decir, donde está el arma (no existen los zurdos en Fallout3).

Lo malo es que Fallout3 no tiene un sistema de coordenadas homogeneizado. En algunas celdas los ejes X e Y tienen una orientación determinada y en otras otra diferente. Solo hay una método para conseguir la posición real del arma en cualquier celda del juego: almacenar el ángulo Z del actor golpeado (el ángulo que se vería desde arriba) y multiplicar las posiciones X e Y con los senos y cosenos de ese ángulo. La idea se vió en este estupendo script creado por Cipscis. (NOTA del AUTOR: mis conocimientos matemáticos son escasos. El código que estamos haciendo funciona entre otras cosas por una interminable fase de pruebas. Sencillamente he probado todas las combinaciones posibles hasta que esta funcionó).

Despues de hacer explotar el arma usaremos la función SetWeaponHealthPerc para dejar su condición en cero. Este es un detalle realista para el efecto.

Veamos como queda el código despues de añadir todo esto. Debemos situar una explosión en una referencia (con la funcion PlaceAtMe) que despues moveremos a la posición del actor golpeado. Para ello necesitamos chequear la posición de ese actor y almacenarla en variables Float a las que sumaremos +20 al eje X y -20 al eje Y (es decir, hacia delante y a la derecha). Notese que la nueva referencia y las variables deben ser creadas también.

ScriptName TeslaRifleScript

ref MySelf
short DadoElectric
short ProbabilidadExp

ref PosARMA
float Ypos
float Zpos
float Xpos
float Zangle 

Begin ScriptEffectStart
	set myself to getself
	If myself.getiscreature == 0 || myself.getiscreaturetype 4 == 1
		if myself.GetWeaponAnimType >= 5 && myself.GetDistance Player < 3000
			set DadoElectric to getRandomPercent
			set ProbabilidadExp to ( 5 + ( player.GetAV luck * 2 ) - ( myself.GetAV luck * 2 ) )
			if DadoElectric < ProbabilidadExp
				if myself.getiscreaturetype 4 == 1
					set PosARMA to PlaceAtMe EyebotExplosion 1, 0, 0
					Set ZAngle to myself.GetAngle Z
					if myself.IsFacingUp == 1
						set Zpos to ( myself.getpos Z ) + 10
					else
						set Zpos to ( myself.getpos Z ) + 105    ;Arriba
					endif
					Set Ypos to ( myself.GetPos Y ) - 20 * sin ZAngle ;Hacia la derecha
					Set Xpos to ( myself.GetPos X ) + 20 * cos ZAngle ;Hacia delante
					PosARMA.setpos z Zpos
					PosARMA.setpos y Ypos
					PosARMA.setpos x Xpos
					myself.SetWeaponHealthPerc 0
				else
					set PosARMA to PlaceAtMe EyebotExplosion 1, 0, 0
					Set ZAngle to myself.GetAngle Z
					if myself.IsFacingUp == 1
						set Zpos to ( myself.getpos Z ) + 10
					else
						set Zpos to ( myself.getpos Z ) + 60    ;Arriba
					endif
					Set Ypos to ( myself.GetPos Y ) - 20 * sin ZAngle  ;Hacia la derecha
					Set Xpos to ( myself.GetPos X ) + 20 * cos ZAngle  ;Hacia delante
					PosARMA.setpos z Zpos
					PosARMA.setpos y Ypos
					PosARMA.setpos x Xpos
					myself.SetWeaponHealthPerc 0
				endif
			endif
		endif
End

En este código he utilizado la explosión del robot OjoBot. Yo personalmente utilicé una explosión propia que explico al final de este tutorial.

Para terminar crearemos el código que empuje al actor.

Lo primero que vamos a hacer es crear una variable short llamada "EstaHecho" que usaremos para evitar que se hagan la explosión del arma y el empujón al mismo tiempo. Esto nos evitará posibles fallos extraños y además será más dinámico. Debemos configurarla en 1 justo despues de hacer explotar un arma, y crearemos una condición para el empujón que revise si la variable es igual a cero. Para que el código funcione una y otra vez debemos configurar la variable "EstaHecho" a cero al principio del script. Además volveremos a crear una condición basada en la distancia, aunque esta vez en 2000 en lugar de 3000.

Lo siguiente que haremos es usar la función IsInList para chequear si el actor golpeado es uno de los que no queremos que sean empujados. Estoy pensando concretamente en los Sanguinarios y en los Behemoth. Si no hicieramos esto nuestro rayo electrico tendría potencia suficiente para empujar a esas criaturas tan grandes.

Para los sanguinarios ya existe una lista en el GECK que los incluye a todos (CrDeathClawList), pero para los Behemoth debemos crear una. Recomiendo el método utilizado en el tutorial anterior ARMA ELECTRICA I: utilizando Críticos para aplicar efectos, pero en lugar de OjoBots incluye los Behemoths del juego. La lista de mi ejemplo se llama BehemothFormListTESLA.

Además usaremos de nuevo la función GetIsCreatureType para evitar que nuestro rayo empuje a los robots. Para ello debemos usar el parámetro 6.

Y por último debemos crear una variable short llamada DadoEmpujon y usar la función GetRandomPercent para darle un valor aleatorio. Igual que hicimos anteriormente. Despues creamos otra variable short llamada ProbabilidadEmp y la configuramos con esta ecuación:

40 + (la SUERTE del jugador multiplicada por 5) - (la SUERTE del Actor por 4)

Cuando todas estas condiciones se cumplan usaremos el comando PushActorAway para empujar al actor con una fuerza de 3 (el Rifle Victoria utiliza una fuerza de 5 y el Rifle Gauss de 10).

Este es el Script final:

ScriptName TeslaRifleScript

ref MySelf
short DadoElectric
short DadoEmpujon
short ProbabilidadExp
short ProbabilidadEmp

ref PosARMA
float Ypos
float Zpos
float Xpos
float Zangle 

Begin ScriptEffectStart
	set EstaHecho to 0
	set myself to getself
	If myself.getiscreature == 0 || myself.getiscreaturetype 4 == 1
		if myself.GetWeaponAnimType >= 5 && myself.GetDistance Player < 3000
			set DadoElectric to getRandomPercent
			set ProbabilidadExp to ( 5 + ( player.GetAV luck * 2 ) - ( myself.GetAV luck * 2 ) )
			if DadoElectric < ProbabilidadExp
				if myself.getiscreaturetype 4 == 1
					set PosARMA to PlaceAtMe EyebotExplosion 1, 0, 0
					Set ZAngle to myself.GetAngle Z
					if myself.IsFacingUp == 1
						set Zpos to ( myself.getpos Z ) + 10
					else
						set Zpos to ( myself.getpos Z ) + 105    ;Arriba
					endif
					Set Ypos to ( myself.GetPos Y ) - 20 * sin ZAngle ;Hacia la derecha
					Set Xpos to ( myself.GetPos X ) + 20 * cos ZAngle ;Hacia delante
					PosARMA.setpos z Zpos
					PosARMA.setpos y Ypos
					PosARMA.setpos x Xpos
					myself.SetWeaponHealthPerc 0
					set EstaHecho to 1
				else
					set PosARMA to PlaceAtMe EyebotExplosion 1, 0, 0
					Set ZAngle to myself.GetAngle Z
					if myself.IsFacingUp == 1
						set Zpos to ( myself.getpos Z ) + 10
					else
						set Zpos to ( myself.getpos Z ) + 60    ;Arriba
					endif
					Set Ypos to ( myself.GetPos Y ) - 20 * sin ZAngle  ;Hacia la derecha
					Set Xpos to ( myself.GetPos X ) + 20 * cos ZAngle  ;Hacia delante
					PosARMA.setpos z Zpos
					PosARMA.setpos y Ypos
					PosARMA.setpos x Xpos
					myself.SetWeaponHealthPerc 0
					set EstaHecho to 1
				endif
			endif
		endif
	ElseIf EstaHecho== 0 && myself.GetDistance Player < 2000
		if myself.isinList BehemothFormListTESLA == 0 && myself.isinList CrDeathClawList == 0
			if myself.getiscreaturetype 6 == 0
				set DadoEmpujon to getRandomPercent
				set ProbabilidadEmp to ( 40 + ( player.GetAV luck * 6 ) - ( myself.GetAV endurance * 4 ) )
				if DadoEmpujon < ProbabilidadEmp
					player.pushactoraway myself 3
				endif
			endif
		endif
	endif
End

Si testeamos el efecto del arma veremos que a menudo empuja a los enemigos si se encuentran a distancia corta, y siempre que no sean ni Robots, ni Sanguinarios, ni Behemoths.

Y cuando no lo empuje, y en raras ocasiones, el arma del enemigo explotará y saldrá volando siempre a la altura adecuada. El arma enemiga será inutilizable desde entonces. A no ser que se repare, claro.

ULTIMAS ANOTACIONES: este a sido un efecto de mi arma desde hace mucho tiempo. En mi caso uso la malla del rifle laser con una nueva textura y cambiando el color del rayo con NifSkope de forma que sea azul.

En este tutorial hemos utilizado la explosión que ya existe en el juego de los OjoBots. Personalmente utilizo una más de mi gusto que puedes copiar de la siguiente imágen. Tiene unos valores más adecuados a mi parecer y sobretodo es capaz de empujar por si misma a los actores cercanos gracias al apartado Known Down Living Actors.


ExplosionGECK.jpg


Para crear una nueva explosión debes ir a SPECIAL EFFECTS--EXPLOSIONS y botón derecho y NEW.

Como último consejo te recomiendo que añadas al Object Effect de tu arma (si usas este Script, claro) el efecto PulseDisableMagicEffect.


PulsoEfectoGECK.jpg


Se trata de un simpático efecto visual que añade algo parecido a la electricidad en el actor golpeado. Está incluido en el juego básico.


--Bauhaus 01:12 19 jun 2009 (UTC)



Volver a la página principal de Fallout 3