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 chiquitisimo el numero!
0.00000000000000000000000000000000000001175494
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.
<UserLang name="TES Script" ext="tes"> <Settings> 000000 ' - " ( ) * , . / : ? [ ] { | } + < = > 1 2 0; 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 Short Long Float Ref GameYear GameMonth GameDay GameHour TimeScale GameDaysPassed
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 Scriptname Begin End <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="" />
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.