Cambios

Ir a la navegación Ir a la búsqueda
Página creada con «{{../Encabezado}} Esta página explica algunos de los fundamentos de Stardew Valley que son útiles para los modders. Ver también Modding:Tareas comunes. ==Conceptos…»
{{../Encabezado}}

Esta página explica algunos de los fundamentos de Stardew Valley que son útiles para los modders. Ver también [[Modding:Tareas comunes]].

==Conceptos==
===Losas===
El mundo se presenta como una cuadrícula de losas. Cada losa tiene una coordenada (x, y) que representa su posición en el mapa, donde (0, 0) es el mosaico superior izquierdo. El valor de x aumenta hacia la derecha y el de y aumenta hacia abajo. Por ejemplo:

[[File:Modding - creating an XNB mod - tile coordinates.png]]

===Posiciones===
El juego utiliza tres sistemas de coordenadas relacionados:

{| class="wikitable"
|-
! sistema de coordenadas
! relativo a
! notas
|-
| posición de la losa
| esquina superior izquierda del mapa
| medido en [[#Losas|losas]]; se utiliza al colocar cosas en el mapap (''p.ej.,'' <samp>location.Objects</samp> utiliza posiciones de la losa).
|-
| posición absoluta
| esquina superior izquierda del mapa
| medido en píxeles; se usa cuando se necesitan mediciones más granulares (''p.ej.,'' movimiento del NPC).
|-
| posición de la pantalla
| esquina superior izquierda visible de la pantalla
| medido en píxeles; se utiliza al dibujar en la pantalla.
|}

He aquí cómo convertir entre ellos:

{| class="wikitable"
|-
!colspan="3"| conversión
! fórmula
|-
| absoluta || → || pantalla
| <code>x - Game1.viewport.X, y - Game1.viewport.Y</code>
|-
| absoluta || → || losa
| <code>x / Game1.tileSize, y / Game1.tileSize</code>
|-
| pantalla|| → || absoluta
| <code>x + Game1.viewport.X, y + Game1.viewport.Y</code>
|-
| pantalla|| → || losa
| <code>(x + Game1.viewport.X) / Game1.tileSize, (y + Game1.viewport.Y) / Game1.tileSize</code>
|-
| losa|| → || absoluta
| <code>x * Game1.tileSize, y * Game1.tileSize</code>
|-
| losa|| → || pantalla
| <code>(x * Game1.tileSize) - Game1.viewport.X, (y * Game1.tileSize) - Game1.viewport.Y</code>
|}

===Campos de red===
Un 'tipo de red' es cualquiera de varias clases que Stardew Valley usa para sincronizar datos entre jugadores, y un 'campo de red' es cualquier campo o propiedad de esos tipos. Se nombran por el <code>Net</code> prefijo en sus nombres de tipo. Los tipos de red pueden representar valores simples como <samp>NetBool</samp>, o valores complejos como <samp>NetFieldDictionary</samp>. El juego recolectará regularmente todos los campos netos accesibles desde <samp>Game1.netWorldState</samp> y sincronizarlos con otros jugadores. Eso significa que muchos cambios de mod se sincronizarán automáticamente en el modo multijugador.

Aunque los campos netos se pueden convertir implícitamente a un tipo de valor equivalente (como <code>bool x = new NetBool(true)</code>), sus reglas de conversión son contrarias a la intuición y propensas a errores (''p.ej.,'' <code>item?.category == null && item?.category != null</code> ambos pueden ser verdaderos a la vez). Para evitar errores, nunca emita implícitamente campos de red; acceda al valor subyacente directamente en su lugar. El paquete NuGet de configuración de compilación debe detectar la mayoría de las conversiones implícitas y mostrar una advertencia de compilación adecuada.

Aquí se explica cómo acceder a los datos en algunos tipos de red comunes:
{| class="wikitable"
|-
! tipo de red
! descripción
|-
| <samp>NetBool</samp><br /><samp>NetColor</samp><br /><samp>NetFloat</samp><br /><samp>NetInt</samp><br /><samp>NetPoint</samp><br /><samp>NetString</samp>
| Un valor sincronizado simple. Acceda al valor usando <samp>field.Value</samp>.
|-
| <samp>NetCollection&lt;T&gt;</samp><br /><samp>NetList&lt;T&gt;</samp><br /><samp>NetObjectList&lt;T&gt;</samp>
| Una lista de valores <samp>T</samp>. Esto implementa las interfaces estándar como [https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 <samp>IEnumerable&lt;T&gt;</samp>] y [https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.ilist-1 <samp>IList&lt;T&gt;</samp>], por lo que puede iterarlo directamente como el <code>foreach (T el valor en el campo)</code>.
|-
| <samp>NetLongDictionary&lt;TValue, TNetValue&gt;</samp><br /><samp>NetPointDictionary&lt;TValue, TNetValue&gt;</samp><br /><samp>NetVector2Dictionary&lt;TValue, TNetValue&gt;</samp>
| Mapas <samp>Long</samp>, <samp>Point</samp>, o <samp>Vector2</samp> para instancias de <samp>TValue</samp> (el tipo de valor subyacente) y <samp>TNetValue</samp> (el tipo de red sincronizada). Puede iterar llaves/valor en pares como el <code>foreach (KeyValuePair<Long, TValue> pair in field.Pairs)</code> (reemplazando <samp>Long</samp> con <samp>Point</samp> o <samp>Vector2</samp> si es necesario).
|}

===Nivel del zoom===
El jugador puede establecer un nivel de zoom en el juego entre 75% y 200%, que ajusta el tamaño de todos los píxeles que se muestran en la pantalla. Por ejemplo, aquí hay un reproductor con el mismo tamaño de ventana en diferentes niveles de zoom:

{| class="wikitable"
|-
! nivel mínimo de zoom (75%)
! nivel máximo de zoom (200%)
|-
| [[File:Zoom level 75.png|300px]]
| [[File:Zoom level 200.png|300px]]
|}

; Efecto en los mods de SMAPI
: En el código del juego, esto está representado por el campo <samp>Game1.options.zoomLevel</samp>. Las coordenadas generalmente se ajustan para el nivel de zoom automáticamente, por lo que rara vez necesita tener esto en cuenta; pero puede convertir una coordenada no ajustada usando <code>position * (1f / Game1.options.zoomLevel)</code> si es necesario.

===Escalado del IU===
El jugador puede escalar la interfaz de usuario entre un 75 % y un 150 %, por separado y junto al [[#Nivel del zoom|nivel del zoom]]. Eso ajusta el tamaño de los píxeles que se muestran en la pantalla solo para los elementos de la interfaz de usuario. Por ejemplo, aquí hay un reproductor con el mismo tamaño de ventana en diferentes niveles de escala de IU:

{| class="wikitable"
|-
! escala mínima de IU (75 %)
! escala máxima de IU (150%)
|-
| [[File:UI scale 75.png|300px]]
| [[File:UI scale 150.png|300px]]
|}

; Efecto en los mods de SMAPI
: El juego tiene dos modos de escala distintos según el contexto: ''modo de interfaz de usuario'' y ''modo sin interfaz de usuario''. Puedes comprobar <samp>Game1.uiMode</samp> para saber qué modo está activo. Debe tener cuidado de no mezclar coordenadas de IU y no IU para evitar cálculos complicados; por ejemplo, haga todo su trabajo en un sistema de coordenadas y luego conviértalo una vez.


: Una referencia rápida de escenarios comunes:
: {| class="wikitable"
|-
! contexto
! modo de la escala que se aplica
|-
| menús en los que se puede hacer click
| Modo de interfaz de usuario (generalmente)
|-
| elementos del HUD
| modo de interfaz de usuario
|-
| [[Guía del Modder/APIs/Eventos#Display.RenderingActiveMenu|<samp>RenderingActiveMenu</samp>]]<br />[[Guía del Modder/APIs/Eventos#Display.RenderedActiveMenu|<samp>RenderedActiveMenu</samp>]]
| modo de interfaz de usuario
|-
| [[Modding:Guía del Modder/APIs/Eventos#Display.Rendering|<samp>Rendering</samp>]]<br />[[Guía del Modder/APIs/Eventos#Display.Rendering|<samp>Rendered</samp>]]
| depende del contexto; chequear en <samp>Game1.uiMode</samp>
|-
| <samp>draw</samp> método para objetos del mundo
| modo sin interfaz de usuario
|-
| coordenadas de la losa (sin píxeles)
| no se ve afectado por la escala de la interfaz de usuario
|}

: Si necesita dibujar la interfaz de usuario cuando el juego no está en modo de interfaz de usuario, puede establecer explícitamente el modo de escalado de interfaz de usuario:
: <syntaxhighlight lang="c#">Game1.game1.InUIMode(() =>
{
// su código de dibujo de UI aquí
});
</syntaxhighlight>

: En el modo de interfaz de usuario, normalmente debe reemplazar <samp>Game1.viewport</samp> con <samp>Game1.uiViewport</samp>. '''No''' haga esto si va a ajustar las posiciones para el escalado de la interfaz de usuario por separado, ya que la conversión doble le dará resultados incorrectos. Puede convertir entre coordenadas UI y no UI usando <samp>Utility.ModifyCoordinatesForUIScale</samp> y <samp>Utility.ModifyCoordinatesFromUIScale</samp>.

: Puedes probar si tu mod tiene en cuenta esto correctamente ajustando el zoom al máximo y la escala de la interfaz de usuario al mínimo (''es decir.,'' teniéndolos en valores opuestos) o viceversa; en particular, verifique cualquier lógica que maneje las posiciones de los píxeles, como hacer clic en los menús.

==Accesos==
===Llaves de cadena===
Una ''llave de cadena'' identifica de forma única dónde encontrar texto traducible, en la forma <samp>{{t|asset name}}:{{t|key}}</samp>. Por ejemplo, <code>Game1.content.GetString("Strings\\StringsFromCSFiles:spring")</code> buscará un <samp>spring</samp> llave en <samp>Strings\StringsFromCSFiles</samp> archivo en la carpeta de contenido (que contiene "primavera"). Esto se usa comúnmente en el código del juego (a través de <code>Game1.content.GetString</code> y en los activos de datos que necesitan texto traducible.

==Clases principales==
===Game1===
<samp>Game1</samp> es la lógica central del juego. La mayor parte del estado del juego se rastrea a través de esta clase. Estos son algunos de los campos más útiles:

{| class="wikitable"
|-
! campo
! tipo
! propósito
|-
| <samp>Game1.player</samp>
| <samp>Farmer</samp>
| El jugador actual.
|-
| <samp>Game1.currentLocation</samp>
| <samp>[[#GameLocation|GameLocation]]</samp>
| La ubicación del juego que contiene al jugador actual. '''Para un jugador no principal, puede ser <samp>null</samp> al hacer la transición entre ubicaciones.'''
|-
| <samp>Game1.locations</samp>
| <samp>IList&lt;[[#GameLocation|GameLocation]]&gt;</samp>
| Todas las ubicaciones del juego. '''Para un jugador no principal, use el [[Modding:Modding:Guía del Modder/APIs/Multijugador#Obtener ubicaciones activas|metodo SMAPI's <samp>GetActiveLocations</samp> ]] en su lugar.'''
|-
| <samp>Game1.timeOfDay</samp><br /><samp>Game1.dayOfMonth</samp><br /><samp>Game1.currentSeason</samp><br /><samp>Game1.year</samp>
| <samp>int</samp><br /><samp>int</samp><br /><samp>string</samp><br /><samp>int</samp>
| La hora, el día, la estación y el año actuales. Consulte también [[Modding:Guía del Modder/APIs/Utilidades#Fechas|la utilidad de fecha de SMAPI]].
|-
| <samp>Game1.itemsToShip</samp>
| <samp>IList&lt;Item&gt;</samp>
| No usar (esto es parte de la lógica de guardado). Ver <samp>Game1.getFarm().getShippingBin(Farmer)</samp> en su lugar.
|-
| <samp>Game1.activeClickableMenu</samp>
| <samp>IClickableMenu</samp>
| El menú modales que se muestra. Creando un <samp>IClickableMenu</samp> subclase y asignar una instancia a este campo lo mostrará.
|}

===<span id="GameLocation"></span>GameLocation y otros===
<ul>
<li><samp>GameLocation</samp> representa una ubicación en el juego que los jugadores pueden visitar. Cada ubicación tiene un mapa (el diseño de mosaico), objetos, árboles, personajes, etc. Estos son algunos de los campos más útiles para cualquier ubicación:

{| class="wikitable"
|-
! campo
! tipo
! propósito
|-
| <samp>Name</samp>
| <samp>string</samp>
| El nombre único para esta ubicación. (Esto no es único para interiores de edificios construidos como cabañas; consulte <samp>uniqueName</samp> en su lugar.)
|-
| <samp>IsFarm</samp>
| <samp>bool</samp>
| Si se trata de una granja, donde se pueden plantar cultivos.
|-
| <samp>IsGreenhouse</samp>
| <samp>bool</samp>
| Si se trata de un invernadero, donde se pueden plantar y cultivar cultivos durante todo el año.
|-
| <samp>IsOutdoors</samp>
| <samp>bool</samp>
| Si la ubicación es al aire libre (a diferencia de un invernadero, edificio, etc.).
|-
| <samp>characters</samp>
| [[#Campos de red|<samp>NetCollection</samp>]] de <samp>NPC</samp>
| Los aldeanos, las mascotas, los caballos y los monstruos del lugar.
|-
| <samp>critters</samp>
| <samp>List</samp> of <samp>Critter</samp>
| Los pájaros, ardillas u otros bichos temporales en el lugar.
|-
| <samp>debris</samp>
| [[#Campos de red|<samp>NetCollection</samp>]] de <samp>Debris</samp>
| Los elementos flotantes en la ubicación.
|-
| <samp>farmers</samp>
| <samp>FarmerCollection</samp>
| Los jugadores en el ubicación.
|-
| <samp>Objects</samp>
| <samp>OverlaidDictionary</samp>
| Las cercas colocadas, las máquinas de artesanía y otros objetos en la ubicación actual. (<samp>OverlaidDictionary</samp> básicamente un [[#Campos de red|<samp>NetVector2Dictionary</samp>]] con lógica agregada para mostrar ciertos elementos de búsqueda sobre objetos preexistentes).
|-
| <samp>terrainFeatures</samp>
| [[#Campos de red|<samp>NetVector2Dictionary</samp>]] de <samp>TerrainFeature</samp>
| Los árboles, árboles frutales, hierba alta, tierra cultivada (incluyendo cultivos) y pisos en el lugar. Para cada par, la clave es su posición de mosaico y el valor es la instancia de la característica del terreno.
|-
| <samp>waterTiles</samp>
| <samp>bool[,]</samp>
| Una matriz multidimensional que indica si cada losa en el mapa es un losas de lago/río. Por ejemplo, <code>if (location.waterTiles[10, 20])</code> comprueba la losa en la [[#Losas|posición]] (10, 20).
|}</li>

<li><samp>BuildableGameLocation</samp> del juego para construires una subclase deUbicación del juegopara lugares donde los jugadores pueden construir edificios. En el juego de vainilla, solo la granja es un lugar edificable. Estos son los campos más útiles:

{| class="wikitable"
|-
! campo
! tipo
! propósito
|-
| <samp>buildings</samp>
| [[#Campos de red|<samp>NetCollection</samp>]] de <samp>Building</samp>
| Los edificios en el lugar.
|}</li>

<li><samp>Farm</samp> es una subclase de ambos <samp>GameLocation</samp> and <samp>BuildableGameLocation</samp> del juego para construirpara lugares donde el jugador puede tener animales y cultivar. En Vanilla, solo hay una ubicación de granja (a la que se accede mediante <code>Game1.getFarm()</code>). Estas son sus propiedades más útiles:

{| class="wikitable"
|-
! campo
! tipo
! propósito
|-
| <samp>animals</samp>
| [[#Campos de red|<samp>NetLongDictionary</samp>]] de <samp>FarmAnimal</samp>
| os animales de granja actualmente en el lugar.
|-
| <samp>resourceClumps</samp>
| [[#Campos de red|<samp>NetCollection</samp>]] de <samp>ResourceClump</samp>
| Los cultivos gigantes, tocones grandes, rocas y meteoritos en el lugar.
|-
| <samp>piecesOfHay</samp>
| [[#Campos de red|<samp>NetInt</samp>]]
| La cantidad de heno almacenado en silos.
|-
| <samp>shippingBin</samp>
| [[#Campos de red|<samp>NetCollection</samp>]] de <samp>Item</samp>
| Los artículos en el contenedor de envío.
|}</li>

<li>Hay una serie de subclases para una ubicación específica (como <samp>AdventureGuild</samp>) que tienen campos útiles para casos específicos.</li>
</ul>

[[en:Modding:Modder Guide/Game Fundamentals]]
[[ru:Модификации:Моддер гайд/Основы игры]]
[[zh:模组:制作指南/游戏基本架构]]
836

ediciones

Menú de navegación