-- ============================================================================ -- ItemFusion - Config (CLIENTE) -- PacketName y PacketHead deben coincidir con el Config.lua del servidor. -- ============================================================================ return { Enable = 1, PacketName = "ItemFusion", PacketHead = 214, OpenKey = "L", -- 1 = la tecla ESC cierra la ventana de fusion. Requiere que Keys.Escape -- este definido en Data/Custom/Script/Util/Defines.lua (VK_ESCAPE = 27); -- sin esa entrada la comparacion se hace contra nil y nunca cierra, -- que es lo que pasaba antes. -- 0 = ESC no hace nada aca (se cierra con la tecla de abrir o con la X). -- Ponelo en 0 si el menu nativo de ESC molesta al abrirse encima. CloseOnEscape = 1, MaxSocket = 5, LockedSocket = 255, -- ------------------------------------------------------------------ -- QUE ITEMS SE PUEDEN FUSIONAR: la lista NO esta aca. -- -- Vive en el Config.lua del SERVIDOR, en el bloque FusionItems, porque -- es una regla de validacion y tiene que tener una sola fuente de -- verdad. Duplicarla aca solo serviria para que las dos se desincronicen. -- El cliente no filtra nada: manda el item y el servidor acepta o avisa. -- -- 02. Configuracion Servidor/A. ServerFREE/Data/Script/Scripts/ItemFusion/Config.lua -- 02. Configuracion Servidor/B. ServerCS/Data/Script/Scripts/ItemFusion/Config.lua -- ------------------------------------------------------------------ -- Preview local. El servidor recalcula todo al confirmar la fusion. Rules = { Luck = "or", Skill = "or", Option3 = "max", Excellent = "or_bits", Level = "max", }, -- Tope de opciones excelentes -- ESPEJO del Config del servidor. -- Hay 6 posibles (bits 1,2,4,8,16,32); con 5 la fusion nunca da el full. -- Aca solo sirve para que el preview de la ventana coincida con lo que -- despues entrega el servidor: si los dos valores no son iguales, el -- jugador ve 6 opciones y recibe 5. Cambiar SIEMPRE los dos juntos. MaxExcellentOptions = 5, -- Solo para mostrar la probabilidad estimada en la UI. El servidor -- recalcula y decide el resultado real al confirmar. SuccessRate = { Enable = 1, -- ESPEJO del Config del servidor. Orden del calculo: -- 45 base -> se restan penalidades -> se suman jewels -- (el VIP multiplica SOLO el bonus) -> tope 5..85 MinRate = 5, MaxRate = 85, DefaultBaseRate = 45, LevelPenalty = { [0] = 0, [1] = 0, [2] = 0, [3] = 0, [4] = 0, [5] = 0, [6] = 0, [7] = 3, [8] = 3, [9] = 3, [10] = 5, [11] = 7, [12] = 9, [13] = 11, [14] = 13, [15] = 15, }, ExcellentPenalty = 1, SocketPenalty = 1, VipBonusMult = { [0] = 1.0, [1] = 1.3, [2] = 1.3, [3] = 1.3, }, }, -- ==================================================================== -- CAJA DE JEWELS -- ESPEJO del Config del SERVIDOR. -- -- Solo sirve para el estimado que muestra la ventana; quien decide es el -- servidor. Si estos numeros no coinciden con los de alla, el jugador ve -- una probabilidad que despues no se cumple: cambiar SIEMPRE los dos. -- -- unidades de un bundle = BundleQtyPerLevel * (Level + 1) -- Level 0 = x10, 1 = x20, 2 = x30 -- puntos = Points * unidades (Points es cuanto suma CADA unidad) -- -- Family agrupa la joya suelta con su bundle para el minimo: 1 Bundled -- Bless x10 ya cubre los 10 Bless que se piden. -- ==================================================================== Jewels = { Slots = 14, Columns = 7, BundleQtyPerLevel = 10, Minimums = { Bless = 10, Chaos = 10, }, Accepted = { -- joyas sueltas [6159] = { Points = 0.91, Bundle = 0, Family = "Chaos", Name = "Jewel of Chaos" }, -- 12,15 [7182] = { Points = 0.98, Bundle = 0, Family = "Soul", Name = "Jewel of Soul" }, -- 14,14 [7181] = { Points = 1.26, Bundle = 0, Family = "Bless", Name = "Jewel of Bless" }, -- 14,13 [7190] = { Points = 1.05, Bundle = 0, Family = "Creation", Name = "Jewel of Creation" }, -- 14,22 [7184] = { Points = 0.91, Bundle = 0, Family = "Life", Name = "Jewel of Life" }, -- 14,16 [7199] = { Points = 1.05, Bundle = 0, Family = "Guardian", Name = "Jewel of Guardian" }, -- 14,31 -- bundles (mismo Points por unidad; la cantidad sale del Level) [6285] = { Points = 0.91, Bundle = 1, Family = "Chaos", Name = "Bundled Jewel of Chaos" }, -- 12,141 [6175] = { Points = 0.98, Bundle = 1, Family = "Soul", Name = "Bundled Jewel of Soul" }, -- 12,31 [6174] = { Points = 1.26, Bundle = 1, Family = "Bless", Name = "Bundled Jewel of Bless" }, -- 12,30 [6281] = { Points = 1.05, Bundle = 1, Family = "Creation", Name = "Bundled Jewel of Creation" }, -- 12,137 [6280] = { Points = 0.91, Bundle = 1, Family = "Life", Name = "Bundled Jewel of Life" }, -- 12,136 [6282] = { Points = 1.05, Bundle = 1, Family = "Guardian", Name = "Bundled Jewel of Guardian" }, -- 12,138 }, }, -- Paleta actual: metal oscuro + bordo. TitleText queda dorado. -- Se conservan los nombres BorderGold/BorderGoldLo para no tocar todos -- los helpers visuales, aunque hoy representan acentos bordo. Colors = { PanelBg = { 8, 9, 9, 150 }, PanelBg2 = { 18, 19, 19, 185 }, BorderGold = { 135, 32, 36, 255 }, BorderGoldLo = { 64, 18, 22, 255 }, TitleText = { 255, 241, 198, 255 }, BodyText = { 232, 232, 224, 255 }, DimText = { 168, 168, 158, 255 }, SlotBg = { 12, 13, 13, 225 }, SlotBgHover = { 30, 19, 21, 235 }, SlotBorder = { 102, 82, 82, 255 }, SlotBorderOn = { 176, 42, 48, 255 }, BtnBg = { 27, 19, 20, 230 }, BtnBgHover = { 48, 21, 24, 240 }, BtnBgOff = { 17, 14, 15, 145 }, BtnBorder = { 118, 46, 50, 255 }, Success = { 130, 220, 120, 255 }, Error = { 220, 90, 80, 255 }, -- Texto del placeholder de la caja de jewels: gris apagado y algo -- transparente, para que se lea sin competir con el resto del panel. HintText = { 138, 132, 120, 195 }, }, -- ------------------------------------------------------------------ -- Cartel de ayuda que se ve DENTRO de la caja de jewels mientras esta -- vacia. Apenas entra la primera joya desaparece solo. -- -- Y = borde superior del interior de la caja (ver LayoutTuning); las -- lineas se centran verticalmente ahi adentro (48 px de alto util). -- -- OJO con el ancho: la ventana tiene 190 px y el texto va centrado, asi -- que conviene no pasar de ~32 caracteres por linea. Y NO usar el -- caracter de porcentaje ni acentos en estos textos. -- ------------------------------------------------------------------ JewelBoxHint = { Y = 134, LineHeight = 8, Lines = { "Mínimo: 10 Bless y 10 Chaos", "Más jewels = más % éxito", "(Bless, Soul, Chaos, Life, Creation)", " ", }, }, -- Formato nativo tipo Scripts/NewWindow de Louis: 190x428, pegado al inventario. Window = { W = 190, H = 428, HeaderH = 64, AnchorOffsetX = 380, }, -- Recarga este Config.lua mientras la ventana esta abierta. -- Enable=1 permite guardar cambios y verlos sin cerrar el cliente. HotReload = { Enable = 1, Frames = 20, }, -- Posiciones de los cuadros/boton relativas a la esquina superior izquierda -- de la ventana. X mueve derecha/izquierda, Y mueve abajo/arriba. -- -- MEDIDOS del arte (2026-08-03). El sprite Panel es (0,0,380,856) del atlas -- y se dibuja a 190x428, o sea a MITAD de escala: coordenada de ventana = -- coordenada del atlas / 2. Cada valor de aca sale de medir el recuadro -- dibujado en fusion_atlas.png y dividirlo por 2, asi el rectangulo logico -- (el que ademas define el area de CLICK) cae justo sobre el marco pintado. -- -- caja atlas x1..x2 , y1..y2 -> ventana -- ItemA 46..163 , 99..208 centro 52.2 , 76.7 -- ItemB 217..334 , 99..208 centro 137.7 , 76.7 -- Caja jewels 46..334 , 261..369 interior 25.5..165 , 134..182.5 -- Result 133..250 , 564..673 centro 95.7 , 309.2 -- -- Las ranuras de jewels NO estan dibujadas en el arte: el atlas trae una -- sola caja grande vacia y se reparten adentro por calculo. -- Con lado 18 entran 7 x 2: paso de 20 px (18 de ranura + 2 de aire), la -- fila arranca en 26 y termina en 164, o sea centrada en 95 igual que el -- resto del panel. Las filas van en 141 y 161 (2 px entre una y otra). -- Quedan 7 px de aire arriba y 3.5 abajo: a proposito NO esta centrado -- verticalmente, va un poco mas abajo porque asi se ve mejor en pantalla. -- -- Control de calidad: ItemA/ItemB quedan simetricos respecto del centro del -- panel (95), y Plus / Result / Button caen exactamente en ese centro. LayoutTuning = { Close = { X = 163, Y = 4, Size = 20 }, ItemA = { X = 24, Y = 49, Size = 56 }, ItemB = { X = 110, Y = 49, Size = 56 }, Plus = { X = 87, Y = 66, Size = 16 }, -- fila de arriba Jewel1 = { X = 26, Y = 141, Size = 18 }, Jewel2 = { X = 46, Y = 141, Size = 18 }, Jewel3 = { X = 66, Y = 141, Size = 18 }, Jewel4 = { X = 86, Y = 141, Size = 18 }, Jewel5 = { X = 106, Y = 141, Size = 18 }, Jewel6 = { X = 126, Y = 141, Size = 18 }, Jewel7 = { X = 146, Y = 141, Size = 18 }, -- fila de abajo Jewel8 = { X = 26, Y = 161, Size = 18 }, Jewel9 = { X = 46, Y = 161, Size = 18 }, Jewel10 = { X = 66, Y = 161, Size = 18 }, Jewel11 = { X = 86, Y = 161, Size = 18 }, Jewel12 = { X = 106, Y = 161, Size = 18 }, Jewel13 = { X = 126, Y = 161, Size = 18 }, Jewel14 = { X = 146, Y = 161, Size = 18 }, Result = { X = 68, Y = 281, Size = 56 }, Button = { X = 31, Y = 358, W = 128, H = 32 }, }, -- Ajuste fino del icono 3D dibujado dentro de cada cuadro. -- X/Y son desplazamientos; W/H agrandan o reducen el area de CreateItem. -- -- OJO: los valores viejos (-10,-7 / -6,-12) NO eran centrado: estaban -- COMPENSANDO el desfase del LayoutTuning anterior. Ej. ItemA se dibujaba en -- X=32 cuando el marco del arte esta en X=24, y el -10 volvia a correr el -- icono a la izquierda para que pareciera centrado. Ya corregido el layout, -- esa compensacion sobra y quedan solo los residuos reales de centrado: -- el icono se dibuja 4 px mas grande que la caja (W/H = +4) y se sube un -- poco (Y = -4) porque el modelo del item se ancla mas abajo del centro. -- Jewel = valor por defecto de TODAS las ranuras de la caja. Como son -- iguales alcanza con esta entrada de grupo; si alguna necesita un retoque -- propio se agrega Jewel1..JewelN y esa pisa al grupo. -- -- En X la cuenta es geometrica: el icono se dibuja W/H = +4 px mas grande -- que la ranura, asi que centrarlo es correrlo la mitad -> X = -2. -- -- En Y NO alcanza con el centro geometrico y cada grupo tiene su valor, -- ajustado mirando el resultado en pantalla: -- Jewel -2 las joyas son un sprite chico y centrado, les basta el -- centrado geometrico (con -4 quedaban visiblemente altas). -- Main -- Result -4 los modelos de equipo (cascos, armas, sets) se dibujan -- anclados mas abajo dentro de su caja, asi que necesitan -- 2 px extra hacia arriba para verse centrados en el marco. RenderTuning = { Default = { X = 0, Y = 0, W = 0, H = 0 }, Main = { X = -2, Y = -10, W = 4, H = 4 }, Jewel = { X = -2, Y = -2, W = 4, H = 4 }, Result = { X = -2, Y = -10, W = 4, H = 4 }, ItemA = { X = -2, Y = -10, W = 4, H = 4 }, ItemB = { X = -2, Y = -10, W = 4, H = 4 }, }, -- ================================================================== -- UN SOLO ATLAS PARA TODO (fusion_atlas.png, 1024x1024) -- -- El cliente maneja bien UNA sola textura propia. Con dos atlas (dos -- Id distintos) solo dibujaba bien uno: el panel salia perfecto y los -- efectos mostraban recortes del otro atlas. Mismo sintoma que cuando -- se probo con 18 PNG sueltos, donde solo la PRIMERA imagen salia -- bien. Por eso ahora va todo junto en una imagen con un unico Id. -- -- Distribucion del archivo: -- x 0-511 , y 0-1023 : lo que era fusion_panel_full_atlas.png -- x 512-1023, y 0- 511 : lo que era fusion_render_atlas.png -- Las coordenadas del panel quedaron IGUALES; las de UI y efectos -- suman 512 en X. -- -- UiAtlas y RenderedAtlas comparten Id/Path a proposito: son dos -- vistas del mismo archivo, cada una con sus sprites. El cargador -- detecta que es el mismo Id y no lo carga dos veces. -- ================================================================== UiAtlas = { Enable = 1, Id = 40151, Path = "Data//Custom//ScriptImages//ItemFusion//fusion_atlas.png", Width = 1024, Height = 1024, Sprites = { -- Hay UN solo recuadro dibujado; los 4 estados salen del mismo -- sprite variando alpha/tinte (asi lo hace DrawRenderedSlot). Slot = { 521, 5, 110, 118 }, SlotHover = { 521, 5, 110, 118 }, SlotFilled = { 521, 5, 110, 118 }, SlotFilledHover = { 521, 5, 110, 118 }, Plus = { 900, 4, 24, 24 }, Close = { 930, 2, 30, 30 }, -- el mas apagado CloseHover = { 962, 2, 30, 30 }, -- el mas brillante -- Hover usa el mismo arte que el normal: sin resplandor extra. Button = { 648, 6, 240, 57 }, ButtonHover = { 648, 6, 240, 57 }, ButtonOff = { 646, 132, 245, 60 }, Divider = { 522, 203, 236, 18 }, -- ---- Sprites de efecto ---- FxGlow = { 512, 256, 128, 128 }, -- halo redondo suave FxRing = { 640, 256, 128, 128 }, -- anillo (onda expansiva) FxStar = { 768, 256, 64, 64 }, -- chispa / estrella FxSweep = { 832, 256, 128, 64 }, -- barrido de luz diagonal FxBox = { 512, 384, 128, 128 }, -- halo cuadrado (realce de slot) FxBeam = { 688, 384, 32, 128 }, -- columna de luz vertical }, }, -- ------------------------------------------------------------------ -- EFECTOS -- Todo por frames, sin timers: el render corre cada frame y va bajando -- los contadores. Cada bloque se puede apagar por separado. -- ------------------------------------------------------------------ Fx = { Enable = 1, -- Pulso al colocar un item en un cuadro PlaceFrames = 34, -- Latido de la runa cuando los dos cuadros estan listos RunePulse = 0, RunePeriod = 84, -- frames por ciclo completo -- Brillo que cruza el boton mientras esta habilitado ButtonSweep = 0, SweepPeriod = 95, -- frames entre pasadas -- Fusion exitosa: anillo + destello + chispas ProcessingFrames = 120, SuccessFrames = 64, SuccessSparks = 9, ResultHoldFrames = 150, -- Fallo: parpadeo rojo del panel FailFrames = 22, -- Sonidos (nil = sin sonido). IDs a confirmar en vivo. SoundPlace = nil, SoundSuccess = nil, SoundFail = nil, }, -- MISMO archivo y MISMO Id que UiAtlas (ver el comentario largo alla -- arriba). Estas coordenadas no cambiaron porque el atlas del panel -- quedo pegado en el origen del archivo unificado. RenderedAtlas = { Enable = 1, Id = 40151, Path = "Data//Custom//ScriptImages//ItemFusion//fusion_atlas.png", Width = 1024, Height = 1024, Sprites = { Panel = { 0, 0, 380, 856 }, Button = { 0, 856, 256, 64 }, ButtonHover = { 0, 856, 256, 64 }, ButtonOff = { 256, 856, 256, 64 }, -- SIN CloseHover a proposito. Estaba declarado en {256,920,40,40} -- pero esa zona del atlas esta VACIA, y como DrawRenderedAsset -- devuelve exito igual (dibuja transparente), nunca se llegaba a -- probar el atlas de UI: el boton cerrar DESAPARECIA al pasarle -- el mouse. Al no estar la clave, cae solo al UiAtlas, que si -- tiene Close y CloseHover dibujados. }, }, SlotIconSize = 64, }