Sie sind auf Seite 1von 22

Scripting para TESCS

(TES Construction Set para


TES:Oblivion)

Versión 0.1 Beta

Última modificación: 31/01/2008

Autor: LhaN

Mi Blog: http://lhan999.blogspot.com
Prologo
En vista de mi necesidad y de mis ganas me he propuesto hacer
algún pequeño mod para el juego The Elder Scroll 4: Oblivion. Dada
la libertad que ofrece el juego y que los sistemas empleados por el
juego originalmente a mi criterio son un fiasco, decidí buscar un mod
que mejorara un poco estos aspectos. Me encontré con uno llamado
ORM, pero habían muchas versiones dando vuelta y finalmente solo
jugué con la versión 1.5.3 Rebuild 3.0. Pero no cubrió todas mis
necesidades, es mas, algunas a pesar de haber cambiado no habían
sido mejoradas, sino que habían sido empeoradas. Esto es mi criterio.
No digo que sea mal mod, muy por el contrario, trae un montón de
cosas buenas, además de que es uno de los únicos (si es que no es el
único) súper mod en español (con esto se gana la mitad de mi favor y
agradecimiento). Así que decidí que si alguien mas podía, por que yo
no?

El camino hasta ahora ha sido difícil, poca información en español,


la mayoría hablan directamente de los scripts pero no donde y
cuando van colocados (esto uno lo llega a saber o por acto de magia
o por haber visto cientos de scripts). En este tutorial voy a ir
plasmando todo lo que valla aprendiendo, que por ahora es poco. No
perdamos mas el tiempo entonces, basta de cháchara y empecemos.
Introducción
Como todo en el mundo del desarrollo, vamos a tener tres fases
principales, que pueden repetirse en un bucle (que a veces parece
infinito). La inicialización, la codificación y la ejecución. Para los que
ya hayan programado antes tendrán una idea de a que me refiero,
para los que no, recuerden cuando en la escuela les enseñan a leer
un libro, el libro tiene 3 partes principales, el comienzo, el nudo y el
desenlace.

Nota: Tengan presente que no siempre se hacen las cosas en orden y que a veces a
mitad del camino surgen cosas que no podemos o no queremos evitar. Llevar las
cosas en orden es bueno, pero no dejarse nutrir del camino que uno recorre por
conservar el orden es muy malo.

Inicialización
La inicialización consta de 2 partes fundamentales, la inicialización
de un entorno de desarrollo o IDE y la inicialización de los scripts.

Preparando el IDE
La mayoría de los lenguajes de programación presentan diferentes
IDE’s, los IDE’s son todas las herramientas, manuales, tutoriales,
información, foros, paginas sobre ese lenguaje. Dentro del IDE para
el scripting en Oblivion podemos mencionar.

TES Construnction Set (TESCS): La herramienta de edición del


juego para hacer mods. No viene incluida en el juego, es necesario
bajarla. La ultima versión (30/01/2008) es 1.2.404.

Paginas: También dentro del IDE podemos encontrar esta página,


el wiki de cs en ingles y los tutoriales en el foro de clan dlan. Mucho
de lo que aprendí, lo hice de esas dos paginas, otras cosas las
aprendí por la experiencia en otros trastos similares o por casualidad.
También esta la web TES Nexos, en ella hay miles de mods para
bajar. Antes de hacer algo es bueno saber si no esta hecho ya.

Referencias:

[http://cs.elderscrolls.com/constwiki/index.php/Main_Page]
[http://www.clandlan.net/foros/index.php?showforum=109]
[http://www.tesnexus.com]
Además también como parte del IDE tenemos los manuales,
tutoriales, información y foros que esas páginas ofrecen.

En nuestro caso el IDE es bastante reducido y la información en


español es mínima.

Para empezar con lo básico, vamos a necesitar entonces el TESCS


la última versión disponible, un poco de lectura de ingles, las dos
páginas mencionadas a modo de referencia y por supuesto el juego
para probar lo que hagamos.

Comencemos la preparación:

 Instalar el juego si no esta instalado aun.

 (Opcional) Instalar las expansiones del juego si no están


instaladas aun y las tienes.

 Descargar la última actualización del juego, Ver el Apéndice I


para mas información.

 Instala el TESCS, Ver el Apéndice I para mas información.

Nota: Existen además extensiones para los scripts, no tengo bien en claro si son
scripts de scripts o funciones para scripts. Una de ellas es el OBSE (Oblivion Script
Extender). Más información en la wiki del TESCS.

Que mas necesitamos?


Además de los aspectos técnicos, como me aconsejo el amigo
Liant de la comunidad de Clan Dlan:

Aprender un mínimo de ingles ( tampoco te creas que necesitas


ser un gurú, con que entiendas texto escrito en ingles de forma
"general" te vale ) te seria mas que beneficioso para programar o
hacer scripts.

Lo segundo que te va a venir muy bien es ganas, muchas ganas e


interés.

Lo tercero y no menos importante es paciencia, mucha paciencia,


y después, mas paciencia, y luego algo mas de paciencia...

Y lo cuarto, curiosidad. Investiga los muchos scripts que ya vienen


en el juego, o los que encuentres por otro lado. Sácales el jugo hasta
que averigües que es lo que hacen y el porqué.
Usando el TESCS
Abriendo, Guardando y Cerrando Archivos
A diferencia de muchos otros programas aquí no tenemos en el
menú File la opción New, la opción Load y la opción Close. Eso a mi
me mato y por ello le dedico esta sección.

Menú File:

Abrir un archivo
Data… permite abrir y cerrar archivos. Cuando los abrimos
también señalamos cual de los archivos es el que vamos a modificar
y en caso de no señalar ninguno nos permite crear un archivo nuevo.
Hagamos clic entonces en Data…

Se nos abre esta ventana, la ventana Data, aquí


seleccionaremos y señalaremos. Como vemos tenemos una columna
llamada TES File y otra Status. El archivo Oblivion.esm a
diferencia del resto figura como Master File, eso significa que no
puede ser modificado directamente, pero los demás archivos incluidas
las expansiones si pueden ser modificadas, mucho cuidado con esta
situación.

“Abrir Solo Lectura”


Si hacemos doble clic en una de las filas SELECCIONAREMOS el
archivo. Al seleccionar un archivo le estamos diciendo al TESCS que
queremos usar ese archivo como base para el mod. Podemos
seleccionar varios o uno solo. De esta manera podemos usar
contenidos modificados de otros mods(1). Al hacer doble clic vemos
que la casilla en la columna TES File se tilda con una cruz, mientras
que la columna Status no se modifica. La columna Status puede
tener 3 valores. Master File puede ser seleccionada pero no
modificada, Plugin File es un mod que puede ser seleccionado y
modificado y Active File es el mod que vamos a modificar.

(1) Lo ideal es pedir permiso a los autores antes.

“Abrir para Lectura y Escritura”


Para seleccionar un mod como Active File y así poderlo modificar,
seleccionen el mod y pulsen el botón [ Set as Active File ]. Con esto
el único mod con Status Active File será en el que se guarden los
cambios. Como ya dije, solo se puede modificar uno por vez.

“Crear un Mod Nuevo”


Si lo que quieren es crear un mod nuevo no señalen a ninguno
como Active File. Cuando le den OK nos avisara que no hemos
señalado ningún mod como Active File y nos pregunta si deseamos
continuar.

Details…

Este botón nos muestra cuales son los contenidos modificados.


Para mas información sobre la utilidad de esta opción lee el artículo
de la Wiki de TESCS.

[http://cs.elderscrolls.com/constwiki/index.php/Mod_Cleaning_Tutorial]

“Cerrar un archivo”
A simple vista no parece posible cerrar los archivos abiertos para
por ejemplo editar otro mod o empezar de nuevo.

Data… también nos permite cerrar los archivos, si volvemos a esa


opción y desmarcamos los archivos actualmente abiertos los
cerramos.
“Guardando los cambios y modificaciones”
Save guarda los cambios realizados, todo lo que modifiquemos
tiene un * y al guardar solo se guardan esas cosas en un archivo de
extensión .esp que es el mod.

Si hemos elegido alguno de los mod existentes como Active File


los cambios serán guardados en ese mod. Pero si no hemos elegido
ninguno como Active File, o sea todos los mod seleccionados han
quedado con el Status Plugin File, nos dará la opción de guardar
esos cambios y modificaciones en un nuevo archivo .esp, o sea un
nuevo mod.
Que son los scripts?
Los scripts son porciones de código que nos permiten agregar y
modificar la forma en que funciona el juego, sin necesidad de recurrir
a modelos, texturas y sonidos nuevos. Pero si se combinan ambas
cosas los mods pueden ser realmente interesantes.

Nota: De ahora en mas voy a usar indistintamente script, contenido del script y
código, para hacer referencia a los scripts.

Donde están los scripts?


Accediendo a los scripts del juego
Lo primero que yo me pregunte fue… “y ahora? Donde están los
scripts?”. Los scripts los podemos ver fácilmente desde el menú
Gameplay  Edits Scripts… con lo cual nos aparece esta ventana.

Luego vamos al menú Script  Open… y nos aparecera la


siguiente ventana

Como ejemplo he cargado el “ORM 1.5.3 Rebuild.esp”. Esa lista


son los scripts. Si de momento no entiendes nada no te preocupes,
lamentablemente lo que estamos viendo es lo que se llama
comúnmente en programación “código ofuscado”. Esos números son
los nombres de los scripts, y por estar ofuscados no nos dicen de qué
se tratan.

Y aquí se ve una serie de scripts con sus nombres que mas o


menos nos dan una idea de lo que hacen.

Aquí podemos ver los scripts para los cebos de pesca y el cuerno
de guerra entre otros.

Ahora simplemente tenemos que darle doble clic a alguno de los


scripts listados y volveremos al editor de scripts pero con el script
cargado y listo para modificarlo o simplemente leerlo. Yo en este
ejemplo elegí el primer script.

Así luce el script abierto en el editor. Para mejorar la edición de


scripts revisen el Apéndice II de este tutorial.

El código ofuscado también suele alcanzar al contenido del script,


cuando por ejemplo se usan variables con nombres como “f”,
seguramente en su momento quien realizo el código sabía
exactamente lo que f significaba, pero a la larga uno se olvido y eso
puede decantar en pérdida de tiempo y errores. Para mas
información sobre como evitar el código ofuscado lean el Apéndice
III.

Usando un poco de código


Las Variables
Las variables con contenedores de valores, si yo necesito por
ejemplo hacer una suma y guardar el resultado, lo guardo en una
variable. Las variables para ser usadas previamente tienen que ser
declaradas y es recomendable que sean inicializadas. Inicializar una
variable consiste en darle o asignarle un valor inicial antes de usarla.
Las variables tiene un tipo y un valor, el tipo es el rango de valores
que pueden abarcar, el TESCS nos brinda tres tipos numéricos y uno
de referencia o puntero, para mas información sobre referencias o
puntero ver el Apéndice III. Los tipos numéricos son:

Short: entero corto cuyo rango de valores va desde el -32,768 hasta el 32,767

Long: entero largo cuyo rango de valores va desde el -2,147,483,648 hasta el


2,147,483,647

Float: decimal cuyo rango de valores va desde el -3.402823×1038 hasta el -


1.175494×10−38, el 0 y desde 1.175494×10−38 hasta el 3.402823×1038.

El 1.175494×10−38 es 0.00000000000000000000000000000000000001175494
chiquitisimo el numero!

El 3.402823×1038 es 340282300000000000000000000000000000000 buff enorme!

El TESCS nos permite 2 tipos de variables, las globales y las


locales de los scripts.

Las Variables Globales


Las variables globales están disponibles para todos los scripts del
mod. Un buen uso de ellas puede significar que el mod no consume
muchos recursos en sus scripts, un mal uso de ellas puede provocar
literalmente cientos de bugs.

Para declara las variables globales hay que ir al menú Gameplay


 Globals… y se nos abrirá la siguiente ventana.
Esta ventana nos muestra a la izquierda la lista de las variables
globales y a la derecha dos opciones. Variable Type nos permite
elegir el tipo de la variable. Y Value nos permite elegir el valor inicial.

Las variables locales


Las variables locales a diferencia de las globales solo son validad
dentro del script y para ese script solamente. La declaración se
realiza:
float nombreVariable1
short nombreVariable2
long nombrevariable3
Como podrán notar el nombre de la variable no puede contener
espacios, y puede tener números. En general eviten el uso de
nombres sin sentido como “short n” ya que n no nos dice de que se
trata la variable, si por ejemplo necesitan una variable para guardar
la salud del personaje usen “short health” o “short salud”. Para
formar nombres con 2 o mas palabras distingan las palabras con la
primera letra en mayúscula “short saludPersonaje”. Además pueden
usar números, pero siempre el primer carácter de un nombre de
variable debe ser una letra o el guión bajo, “long _miVariable1”.

Sobre los Objetos del juego


Aparentemente y seguramente todo en el juego es un objeto. Para
aquellos que desconozcan el paradigma de orientación a objetos, en
el Apéndice III hay algunas nociones básicas, MUY básicas. Los
scripts nos van a permitir agregar comportamientos a los objetos.
Veamos cuales son los objetos.

El jugador o Player
Quizás el objeto mas importante de todos y que el seguramente
vamos a utilizar muy a menudo es el objeto Player, el jugador en si
mismo. Para hacer referencia al jugador se escribe Player.

Como ya habíamos dicho, el objeto tiene datos, algunos de esos


datos o variables o atributos son Health, Fatigue, Speed, Agility,
etc.

Para poder usar los atributos de un objeto vamos a tener que


pedirle al objeto el valor de dicho atributo, por ejemplo, le pidamos al
objeto Player que nos de el valor de su atributo Health. Esto lo
hacemos con la siguiente sentencia.
Player.GetActorValue Health
Esto nos devuelve el valor de su salud. Pero va a parar a ningún
lado dicho valor. Lo que necesitamos es capturar de alguna manera
ese valor, para eso vamos a necesitar una variable.
Short saludPersonaje ;declaración de la variable
saludPersonaje to Player.GetActorValue Health
Vemos dos cosas nuevas, el uso del ; y una oración, esto es un
comentario, los comentarios se usan para aclarar mejor que hace el
código. Si los usan bien pueden facilitarse mucho la vida cuando
buscan determinadas sentencias.

Lo otro nuevo es la palabra to, esta instrucción es una instrucción


de asignación. Permite que el valor contenido en el atributo Health
del objeto Player se copie en la variable del script saludPersonaje.
Apéndice I El Juego
Sobre el Juego y sus actualizaciones
Al momento de la ultima actualización de este tutorial hay dos
actualizaciones, una para el juego con o sin la primera expansión
(“Knight of the Nine”) y SIN la segunda (“Shivering Island”) y otro
para el juego con o sin la primera expansión y CON la segunda
expansión. Actualmente la ultima actualización es el Parche
v1.2.0416.

Sobre la expansión “Knight of the Nine”


“Knight of the Nine” no tiene actualización por que no modifica el
archivo EXE o ejecutable del juego a diferencia de “Shivering Island”.
“Knight of the Nine” bien podría ser tomado como un conjunto de
mods para Oblivion.

Instalación del TESCS


El TESCS se instala en la carpeta del juego y crea un icono de
acceso directo en el Grupo del Menú Inicio de Bethseda donde están
los accesos directos del juego. Recomiendo copiar el acceso directo al
escritorio para mas comodidad.
Apéndice II Herramientas Adicionales
Mejorando el IDE
El editor incluido en el TESCS para los scripts es muy básico. Me
arriesgo a decir que es más básico que el Notepad de Windows. El
principal problema que podemos tener es que cuando llevamos una
cuantas líneas de código todo se hace un tanto complicado de leer.

Para solucionar esto podemos bajar e instalar el editor de texto


para lenguajes de programación llamado Notepad++, el cual nos
permitirá ver un poco mas ordenado el código del script, además de
darle color.

Para darle color a los scripts realizaremos lo siguiente, luego de


instalado el programa Notepad++, crearemos un nuevo archivo
llamado userDefineLang.xml y copiaremos y pegaremos el
siguiente contenido.
<NotepadPlus>
<UserLang name="TES Script" ext="tes">
<Settings>
<Global caseIgnored="yes" />
<TreatAsSymbol comment="no" commentLine="yes" />
<Prefix words1="no" words2="no" words3="no"
words4="no" />
</Settings>
<KeywordLists>
<Keywords name="Delimiters">000000</Keywords>
<Keywords name="Folder+"></Keywords>
<Keywords name="Folder-"></Keywords>
<Keywords name="Operators">&apos; - &quot; ( ) * , .
/ : ? [ ] { | } + &lt; = &gt;</Keywords>
<Keywords name="Comment">1 2 0;</Keywords>
<Keywords name="Words1">GameMode If EndIf Else Set
Message To OnActivate OnActorEquip OnActorUnequip OnAdd OnAlarm
OnAlarmVictim OnDeath OnDrop OnEquip OnHit OnHitWith OnKnockout
OnLoad OnMagicEffectHit OnMurder OnPackageChange OnPackageDone
OnPackageEnd OnPackageStart OnReset OnSell OnStartCombat
OnTrigger OnTriggerActor OnTriggerMob OnUnequip Return
ScriptEffectFinish ScriptEffectStart
ScriptEffectUpdate</Keywords>
<Keywords name="Words2">Short Long Float Ref
GameYear GameMonth GameDay GameHour TimeScale
GameDaysPassed</Keywords>
<Keywords name="Words3">Activate AddAchievement
AddFlames AddItem AddScriptPackage AddSpell AddTopic
AdvancePCLevel AdvancePCSkill Autosave CanHaveFlames
CanPayCrimeGold Cast CloseCurrentOblivionGate CloseOblivionGate
CompleteQuest CreateFullActorCopy DeleteFullActorCopy Disable
DisableLinkedPathPoints DisablePlayerControls Dispel
DispelAllSpells Drop DropMe DuplicateAllItems DuplicateNPCStats
Enable EnableFastTravel EnableLinkedPathPoints
EnablePlayerControls EquipItem EssentialDeathReload
EvaluatePackage ForceActorValue ForceCloseOblivionGate ForceFlee
ForceTakeCover ForceWeather GetActionRef GetActorValue
GetAlarmed GetAmountSoldStolen GetAngle GetArmorRating
GetArmorRatingUpperBody GetAttacked GetBarterGold
GetBaseActorValue GetButtonPressed GetClassDefaultMatch
GetClothingValue GetCombatTarget GetContainer GetCrime
GetCrimeGold GetCrimeKnown GetCurrentAIPackage
GetCurrentAIProcedure GetCurrentTime GetCurrentWeatherPercent
GetDayOfWeek GetDead GetDeadCount GetDestroyed GetDetected
GetDetectionLevel GetDisabled GetDisease GetDisposition
GetDistance GetDoorDefaultOpen GetEquipped GetFactionRank
GetFactionRankDifference GetFactionReaction GetFatiguePercentage
GetForceRun GetForceSneak GetFriendHit GetFurnitureMarkerID
GetGameSetting GetGlobalValue GetGold GetHeadingAngle
GetIdleDoneOnce GetIgnoreFriendlyHits GetInCell GetInCellParam
GetInFaction GetInSameCell GetInWorldspace GetInvestmentGold
GetIsAlerted GetIsClass GetIsClassDefault GetIsCreature
GetIsCurrentPackage GetIsCurrentWeather GetIsGhost GetIsID
GetIsPlayableRace GetIsPlayerBirthsign GetIsRace GetIsReference
GetIsSex GetIsUsedItem GetIsUsedItemType GetItemCount
GetKnockedState GetLOS GetLevel GetLockLevel GetLocked
GetNoRumors GetOffersServicesNow GetOpenState GetPCExpelled
GetPCFactionAttack GetPCFactionMurder GetPCFactionSteal
GetPCFactionSubmitAuthority GetPCFame GetPCInFaction GetPCInfamy
GetPCIsClass GetPCIsRace GetPCIsSex GetPCMiscStat
GetPCSleepHours GetPackageTarget GetParentRef
GetPersuasionNumber GetPlayerControlsDisabled
GetPlayerHasLastRiddenHorse GetPos GetQuestRunning
GetQuestVariable GetRandomPercent GetRestrained GetScale
GetScriptVariable GetSecondsPassed GetSelf GetShouldAttack
GetSitting GetSleeping GetStage GetStageDone GetStartingAngle
GetStartingPos GetTalkedToPC GetTalkedToPCParam GetTimeDead
GetTotalPersuasionNumber GetTrespassWarningLevel GetUnconscious
GetUsedItemActivate GetUsedItemLevel GetVampire GetWalkSpeed
GetWeaponAnimType GetWeaponSkillType GetWindSpeed GoToJail
HasFlames HasMagicEffect HasVampireFed IsActionRef IsActor
IsActorAVictim IsActorDetected IsActorEvil IsActorUsingATorch
IsAnimPlaying IsCellOwner IsCloudy IsContinuingPackagePCNear
IsCurrentFurnitureObj IsCurrentFurnitureRef IsEssential
IsFacingUp IsGuard IsHorseStolen IsIdlePlaying IsInCombat
IsInDangerousWater IsInInterior IsInMyOwnedCell IsLeftUp IsOwner
IsPCAMurderer IsPCSleeping IsPlayerInJail
IsPlayerMovingIntoNewSpace IsPlayersLastRiddenHorse IsPleasant
IsRaining IsRidingHorse IsRunning IsShieldOut IsSneaking
IsSnowing IsSpellTarget IsSwimming IsTalking IsTimePassing
IsTorchOut IsTrespassing IsTurnArrest IsWaiting IsWeaponOut
IsXBox IsYielding Kill KillAllActors Lock Look LoopGroup
MenuMode (Function) Message MessageBox ModActorValue
ModAmountSoldStolen ModBarterGold ModCrimeGold ModDisposition
ModFactionRank ModFactionReaction ModPCAttribute ModPCFame
ModPCInfamy ModPCMiscStat ModPCSkill ModScale MoveTo PayFine
PayFineThief PickIdle PlaceAtMe PlayBink PlayGroup
PlayMagicEffectVisuals PlayMagicShaderVisuals PlaySound
PlaySound3D PositionCell PositionWorld PreloadMagicEffect
RefreshTopicList ReleaseWeatherOverride RemoveAllItems
RemoveFlames RemoveItem RemoveMe RemoveScriptPackage RemoveSpell
Reset3DState ResetFallDamageTimer ResetHealth ResetInterior
Resurrect Rotate SameFaction SameFactionAsPC SameRace
SameRaceAsPC SameSex SameSexAsPC Say SayTo
ScriptEffectElapsedSeconds SelectPlayerSpell SendTrespassAlarm
SetActorAlpha SetActorFullName SetActorRefraction SetActorValue
SetAlert SetAngle SetAtStart SetBarterGold SetCellFullName
SetCellOwnership SetCellPublicFlag SetClass SetCombatStyle
SetCrimeGold SetDestroyed SetDoorDefaultOpen SetEssential
SetFactionRank SetFactionReaction SetForceRun SetForceSneak
SetGhost SetIgnoreFriendlyHits SetInCharGen SetInvestmentGold
SetItemValue SetLevel SetNoRumors SetOpenState SetOwnership
SetPCExpelled SetPCFactionAttack SetPCFactionMurder
SetPCFactionSteal SetPCFactionSubmitAuthority SetPCFame
SetPCInfamy SetPCSleepHours SetPackDuration SetPos
SetQuestObject SetRestrained SetRigidBodyMass SetScale
SetShowQuestItems SetSize SetStage SetUnconscious SetWeather
ShowBirthsignMenu ShowClassMenu ShowDialogSubtitles
ShowEnchantment ShowMap ShowRaceMenu ShowSpellMaking SkipAnim
StartCombat StartConversation StartQuest StopCombat
StopCombatAlarmOnActor StopLook StopMagicEffectVisuals
StopMagicShaderVisuals StopQuest StopWaiting TrapUpdate
TriggerHitShader UnequipItem Unlock VampireFeed Wait WakeUpPC
WhichServiceMenu Yield</Keywords>
<Keywords name="Words4">Scriptname Begin
End</Keywords>
</KeywordLists>
<Styles>
<WordsStyle name="DEFAULT" styleID="1"
fgColor="A0C818" bgColor="303030" fontName="" fontStyle="0"
fontSize="" />
<WordsStyle name="FOLDEROPEN" styleID="12"
fgColor="000000" bgColor="303030" fontName="" fontStyle="0" />
<WordsStyle name="FOLDERCLOSE" styleID="13"
fgColor="000000" bgColor="303030" fontName="" fontStyle="0" />
<WordsStyle name="KEYWORD1" styleID="5"
fgColor="0000A0" bgColor="303030" fontName="Andale Mono"
fontStyle="1" />
<WordsStyle name="KEYWORD2" styleID="6"
fgColor="008080" bgColor="303030" fontName="Andale Mono"
fontStyle="1" fontSize="9" />
<WordsStyle name="KEYWORD3" styleID="7"
fgColor="0080C0" bgColor="303030" fontName="Andale Mono"
fontStyle="1" fontSize="9" />
<WordsStyle name="KEYWORD4" styleID="8"
fgColor="800040" bgColor="303030" fontName="" fontStyle="1" />
<WordsStyle name="COMMENT" styleID="1"
fgColor="626262" bgColor="303030" fontName="Andale Mono"
fontStyle="0" fontSize="9" />
<WordsStyle name="COMMENT LINE" styleID="2"
fgColor="888888" bgColor="303030" fontName="Andale Mono"
fontStyle="2" fontSize="9" />
<WordsStyle name="NUMBER" styleID="4"
fgColor="000000" bgColor="303030" fontName="" fontStyle="1" />
<WordsStyle name="OPERATOR" styleID="10"
fgColor="FF9000" bgColor="303030" fontName="" fontStyle="0"
fontSize="" />
<WordsStyle name="DELIMINER1" styleID="4"
fgColor="0000FF" bgColor="303030" fontName="" fontStyle="0"
fontSize="" />
<WordsStyle name="DELIMINER2" styleID="4"
fgColor="0000FF" bgColor="303030" fontName="" fontStyle="0"
fontSize="" />
<WordsStyle name="DELIMINER3" styleID="4"
fgColor="0000FF" bgColor="303030" fontName="" fontStyle="0"
fontSize="" />
</Styles>
</UserLang>
</NotepadPlus>

Nota: Esta versión es Beta, todavía no están bien configurados los colores. Aun así
es más cómodo que verlo en blanco y negro. Además mi configuración usa como
color de fondo por defecto el color RGB = 48,48,48. Este estilo a mi me gusta y me
es cómodo, puede que a ti no te sea cómodo o no te guste o no convine con tu
tema de escritorio. La última parte donde dice WordsStyle ahí tienes que modificar
para los colores, el tipo de letra toma por defecto el del Global Style que se
configura desde el menú Configurar Configurador de Estilos.

Guarden el archivo en la carpeta de instalación del Notepad++.


Usualmente es “C:\Archivos de Programa\Notepad++\”. Cierren
el Notepad++, vuélvanlo a abrir. Y en menú Lenguaje, al final
encontraran la opción TES Script, selecciónenla y CHALAN! Ya tiene
el script con colores. Además si guardan cualquier archivo con la
extensión TES automáticamente se selecciona esta visualización.
Mejorando la claridad de lectura del código
Como ya habrás notado tengo una forma particular (y no tanto)
de escribir los scripts, si has leído algún script de otra persona habrás
leído lo siguiente por ejemplo:
ScriptName RiddleChestScript

Short controlvar

Begin OnActivate
If ( controlvar == 0 )
MessageBox "Voiceless it cries, wingless flutters, toothless
bites, mouthless
mutters. What is it?", "Bat", "Old woman", "Wind", "Wraith"
Set controlvar to 1
EndIf
End

Pero seamos realistas… esto es un destre si mas tarde uno quiere


modificar algo, en este ejemplo de pocas líneas no es un problema,
pero si tenemos un ejemplo de varias líneas se vuelve un problema
mas leer, esto se llama dificultar el mantenimiento del código. Eso
quiere decir que si luego de mucho tiempo, tú quieres realizar alguna
modificación al script u otra persona quiere hacerlo, adivinar donde
va que es todo un asunto y pérdida de tiempo.

Yo lo escribiría de la siguiente manera:


ScriptName RiddleChestScript

Short controlvar

Begin OnActivate
If ( controlvar == 0 )
MessageBox "Voiceless it cries, wingless flutters,
toothless bites, mouthless
mutters. What is it?", "Bat", "Old woman", "Wind",
"Wraith"
Set controlvar to 1
EndIf
End
Esto se llama tabular o sangrear el código. De esta manera queda
claro el cuerpo del script y el cuerpo del If. Te recomiendo ser
ordenado desde un principio, mas tarde lo agradecerás y también
cualquiera que tome tu script para aprender o modificar.

Nota: Este código de ejemplo fue extraído de la wiki del TESCS sin permiso, pero
no creo que sea un problema jeje.
Apéndice III Nociones de programación
Sentencias o instrucciones
Cada línea de código que haga algo y que no pueda ser
descompuesta o dividida en porciones mas pequeñas se llaman
sentencias o instrucciones.

Bloques
Conjuntos de sentencias o instrucciones.

Condicional If
If es una sentencia de selección o condición que permite dirigir el
flujo de ejecución de un código. Consiste en dada un determinada
condición (de ahí que se llame condicional) si se cumple (es
verdadera ya que es una sentencia lógica) ejecuta todo el contenido
del If.

Usualmente va acompañado de una sentencia else. Esta sentencia


es la segunda opción, cuando la condición del if no se cumpla, no sea
verdadera, se saltea el contenido del if, y si existe un else se ejecuta
el contenido del else.

Bucles condicionales y no condicionales


Un bucle es un bloque que se repite n veces si es no condicional, o
se repite siempre que una condición se cumpla si es condicional.

Usualmente el bucle condicional es el bucle while y el bucle no


condicional es el bucle for.

Paradigma Orientado a Objetos


La programación ha tenido diferentes maneras de ser realizada. Al
principio los códigos se escribían línea a línea una tras otra y se
realizaban saltos de una línea a otra porción de código sin ningún
orden aparente, solo existían sentencias de salto (para ir por ejemplo
de la sentencia 5 a la sentencia 43 y de la sentencia 56 a la 38 y de
la 41 al final de código) y los condicionales simples (algo así como un
if pero siempre sin else). De ahí surgió el paradigma procedimental,
que ordenaba esta manera de programar, se incluyeron los bucles y
se podía descomponer el código en funciones. Pero esta manera de
pensar esta muy apartada de la realidad, así que apareció una nueva
manera de interpretar los problemas y plantear el código que los
resuelva. Así aparece el paradigma orientado a objetos. Es decir todo
en el mundo real es un objeto, por ejemplo una silla, la silla tiene
datos o variables y constantes, como su altura, su color, su peso, y
además comportamientos, si es de madera puede flotar en el agua, si
tiene las cuatro patas iguales se puede apoyar sobre el piso sin
problemas, si la empujamos se mueve, si nos sentamos no se achata
ni deforma ni desarma. Los objetos en la programación son como los
objetos de la realidad, son un conjunto de datos y comportamientos
empaquetados. En el juego TES Oblivion, el personaje es un objeto,
los datos de este objeto son por ejemplo, la fuerza, la agilidad, la
resistencia, la cantidad de vida, el máximo de vida, etc. Y los
comportamientos son que si pulsamos la tecla W avanza, con el clic
del Mouse ataca, etc.

Nota: Esto es a grandes rasgos y simplificando lo mas posible, hay libro de cientos
de paginas dedicados al tema, y miles de paginas web también.

Código Ofuscado
El código ofuscado es para algunos un arte, consiste en escribir
sentencias de forma tal que a simple vista no tengan ningún sentido.
Usualmente esto se usa para evitar plagios o complicar la existencia a
quien quiera leer tu código. Atentan contra la filosofía del
OpenSource. Pero también puede deberse al uso incorrecto de las
variables o desorden en el código por no tener claro que es lo que
uno quiere hacer. El ejemplo más sencillo de código ofuscado en
nombrar variables o scripts con nombres como 00001 o f. A mi
humilde opinión ofuscar el código consiste en complicarle la vida a los
demás nombrando las cosas de manera complicada y nada intuitiva,
con el fin de ocultar información, otras veces se hace sin querer
queriendo.

Nota: El ejemplo del código ofuscado lo he tomado del ORM 1.5.3 Rebuild 3.0. No
es una crítica ni recriminación, simplemente lo tome de ejemplo para que los
nuevos modders no se asusten al ver estas anomalías. Mil disculpas si alguno de los
autores del mod ORM, ya sea Takyon o Poison se sienten agraviados.

Referencias o punteros
Son como los accesos directos de Windows, es un vinculo a un
objeto o variable. Completar.
Palabras Finales
Hasta aquí llega mi tutorial por el momento, hemos visto la
inicialización y una parte del desarrollo, queda pendiente continuar el
desarrollo de un script y probarlo en el juego. En este momento
todavía no he escrito ningún script, pero esto es lo que he aprendido
a duras penas. En la próxima versión de este tutorial profundizare
aun mas en los scripts y probablemente haga un par de ellos y
veamos ejemplos. Pero por el momento tengo que ponerme a
practicar. Si alguien quiere colaborar en esta pequeña empresa es
bienvenido es, no pido que hagan el tutorial, solo que me aporten
datos para que yo pueda continuar con esto y que otros puedan
aprender. Al final ganamos todos. Ahora mismo estoy trabado en
como hacer que funcione el script una vez escrito. Pero para empezar
creo que esto les da una idea general. Desde ya agradezco a la
comunidad de modders tanto de la wiki del TESCS, la del TES Nexos
y especialmente a los foros de Clan Dlan, por que de otra forma ni
siquiera hubiese conocido que existían mods para Oblivion. Saludos y
espero que les sirva mi pequeña e interminada contribución.

Das könnte Ihnen auch gefallen