Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3821 miembros registrados.
El último usuario registrado es MikeWasauski.

Nuestros miembros han publicado un total de 86306 mensajes en 12303 argumentos.

[XP] RM2k Screen Tone

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] RM2k Screen Tone

Mensaje por Wecoc el 2017-11-19, 04:43

Este script recrea el estilo de tono de pantalla propio de RM2k/2k3, con efecto Overlay en vez de simplemente aditivo/sustrativo.
Para usarlo es necesaria la dll RM2k_ScreenTone.dll (se encuentra en la demo).
Es compatible con prácticamente todo, y muy fácil de usar. No reescribe nada, el nuevo estilo de tono va completamente a parte del normal.
De ese modo se pueden combinar para así lograr efectos de tono de pantalla mejores.

Autor: Wecoc (créditos opcionales)
Demo: RM2k Screen Tone.zip

Spoiler:
Pongo el código de la DLL por si alguien quiere verlo. Es bastante simple, excepto por alguna fórmula para los colores que saqué de la Wikipedia.

Código:
// --------------------------------------------------------------------------------------------------------------------------------------
// RM2k_ScreenTone DLL (RPG maker XP)
// Version: 1.00
// --------------------------------------------------------------------------------------------------------------------------------------

#include <cstdlib>
#include <ctype.h>
#include <math.h>
#include <windows.h>
#include <time.h>
// --------------------------------------------------------------------------------------------------------------------------------------
#define RGSSApi extern "C" __declspec(dllexport)

// --------------------------------------------------------------------------------------------------------------------------------------

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved){
 switch (ul_reason_for_call){
 case DLL_PROCESS_ATTACH:
 case DLL_THREAD_ATTACH:
 case DLL_THREAD_DETACH:
 case DLL_PROCESS_DETACH:
 break;
 }
 return true;
}

// --------------------------------------------------------------------------------------------------------------------------------------
// Rect RGSS (rect.__id__ = object)
// RECTSTRUCT * rect = ((RGSSRECT*)(object<<1))->rectvars;
// --------------------------------------------------------------------------------------------------------------------------------------

typedef struct{
 DWORD unka;
 DWORD unkb;
 DWORD x; // x rect
 DWORD y; // y rect
 DWORD width; // width rect
 DWORD height; // height rect
}RECTSTRUCT;
typedef struct{
 DWORD flags;
 DWORD klass;
 void (*dmark) (void*);
 void (*dfree) (void*);
 RECTSTRUCT * rectvars;
}RGSSRECT;

// --------------------------------------------------------------------------------------------------------------------------------------
// Color RGSS (method 1) (color.__id__ = object)
// RGSSCOLOR *color = ((RGSSCOLOR*)(object << 1));
// color->data[1] = red, color->data[2] = green, color->data[3] = blue, color->data[4] = alpha
// --------------------------------------------------------------------------------------------------------------------------------------

typedef struct{
 DWORD flags;
 DWORD klass;
 void(*dmark) (void*);
 void(*dfree) (void*);
 double *data; //red is index 1, green is index 2, blue 3, alpha 4
}RGSSCOLOR;

// --------------------------------------------------------------------------------------------------------------------------------------
// Bitmap RGSS (method 1) (bitmap.__id__ = object)
// RGSSBMINFO *bitmap = ((RGSSBITMAP*)(object << 1))->bm->bminfo;
// --------------------------------------------------------------------------------------------------------------------------------------

typedef struct{
 DWORD unk1;
 DWORD unk2;
 BITMAPINFOHEADER *infoheader;
 RGSSCOLOR *firstRow;
 RGBQUAD *lastRow;
}RGSSBMINFO;
typedef struct{
 DWORD unk1;
 DWORD unk2;
 RGSSBMINFO *bminfo;
}BITMAPSTRUCT;
typedef struct{
 DWORD flags;
 DWORD klass;
 void(*dmark) (void*);
 void(*dfree) (void*);
 BITMAPSTRUCT *bm;
}RGSSBITMAP;

// --------------------------------------------------------------------------------------------------------------------------------------
int min(int a, int b){
 if (a>b)
 return b;
 else
 return a;
}
// --------------------------------------------------------------------------------------------------------------------------------------
int max(int a, int b){
 if (a>b)
 return a;
 else
 return b;
}

// --------------------------------------------------------------------------------------------------------------------------------------
// Tone2k
// --------------------------------------------------------------------------------------------------------------------------------------

RGSSApi BOOL tone2k(long object, long red, long green, long blue, long alpha){
 RGSSBMINFO *bitmap = ((RGSSBITMAP*)(object << 1))->bm->bminfo;
 int r = 128 + (red   / 2);
 int g = 128 + (green / 2);
 int b = 128 + (blue  / 2);
 DWORD width = bitmap->infoheader->biWidth;
 DWORD height = bitmap->infoheader->biHeight;
 int ix, iy;
 LPBYTE row;
 row = (LPBYTE)(bitmap->firstRow);
 int rowsize = width * 4;
 int avg;
 for (iy = 0; iy < height; iy++) {
 LPBYTE thisrow = row;
 for (ix = 0; ix < width; ix++) {
 int oldb = thisrow[0];
 int oldg = thisrow[1];
 int oldr = thisrow[2];
 thisrow[0] = ((oldb < 128) ? (2 * oldb * b / 255) : (255 - 2 * (255 - oldb) * (255 - b) / 255));
 thisrow[1] = ((oldg < 128) ? (2 * oldg * g / 255) : (255 - 2 * (255 - oldg) * (255 - g) / 255));
 thisrow[2] = ((oldr < 128) ? (2 * oldr * r / 255) : (255 - 2 * (255 - oldr) * (255 - r) / 255));
 if (alpha > 0) {
                avg = (thisrow[0] + thisrow[1] + thisrow[2]) / 3;
                thisrow[0] = (thisrow[0] * (255 - alpha) / 255) + (avg * alpha / 255);
                thisrow[1] = (thisrow[1] * (255 - alpha) / 255) + (avg * alpha / 255);
                thisrow[2] = (thisrow[2] * (255 - alpha) / 255) + (avg * alpha / 255);
 }
 thisrow += 4;
 }
 thisrow += (iy * 4);
 row -= rowsize;
 }
 return true;
}


Última edición por Wecoc el 2017-11-26, 14:16, editado 1 vez
avatar
Wecoc
Administrador
Administrador



Créditos 12105

Gracias : 522

Volver arriba Ir abajo

RPG Maker XP Re: [XP] RM2k Screen Tone

Mensaje por Wecoc el 2017-11-26, 00:50

UPDATE - Versión 1.1

Detecté varios problemas en este script pero ya los he solucionado.

Pongo los avances de la nueva versión.
- Arreglado bug en modo LAGLESS; al volver de otras escenas el tono a veces se veía mal durante la transición de pantalla.
- Arreglado bug, los planes (panoramas y fogs) no cambiaban de tono.
- Ahora también se ve el cambio de tono en batalla.

Han sido cambios solo del script, no de la librería.

UPDATE - Versión 1.2

Siento tantos updates seguidos. Ahora ya debería estar en la versión definitiva.

- Arreglado bug al cambiar gráfico de chara (su tono no quedaba actualizado).
- Añadidos atajos para cambiar tono de panorama, fog y pictures.
avatar
Wecoc
Administrador
Administrador



Créditos 12105

Gracias : 522

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.