scummvm模拟器是在SDL的基础上开发的,以下的资料或许在汉化scummvm模拟器游戏时会派上用处。 1 P% a3 @7 F9 t* K5 A" c! i
4 `" @2 o9 I4 v( D
原文1 x" H9 x) e8 v( J5 S
http://blog.csdn.net/newger/archive/2008/02/26/2121796.aspx
4 d1 L' a) x7 s' J. M" ^! F! G: Q7 k
" K- y0 q$ P9 {, Q) w. r! V; d大家注意到没有,RA2的中文版本使用的是GBK点阵字库,这样做有一个好处:不管玩家是用的简体还是繁体都能识别显示的文字。
$ Q% ]/ K4 G2 S: k4 d0 l' |/ B
/ b0 H) Z- `. w) F- @6 q4 @- wGBK的意思大概是“国家标准汉字扩展字符集”吧,记不清了。但它的确是个好东东,比GB2312、BIG5什么的强多了。因为它包括GB2312、GBK的所有字符而且还补充了很多字,另外,还包括日文、朝鲜文以及大量的符号字符。 . y1 f- }( V; b
2 v# Q! A2 q' m }0 S& `$ R# U4 q' ]我在UCDOS for win版本里面找到了GBK的点阵字库(HZK12.GBK、HZK14.GBK、HZK16.GBK)。分析了一下,知道了结构。这里是我写的一个演示 程序,程序编译需要有sdl库。遵循“惯例”,按F4切换全屏/窗口状态,Esc退出。程序把标准输出和标准错误重定向到"stdout.txt"和 "stderr.txt"中。 ' m: V1 i* [% S! d
! R+ e5 o# ^7 E1 l
6 h: c* [/ d) l
#include <time.h> $ u) T& r/ K9 x' U- ^: R6 O2 [
#include <stdio.h>
1 c: v- ^' w" t#include <stdlib.h>
9 X0 Q# c( P: [#include <windows.h> 3 m( ^6 |( M; m) }! K7 B
, j3 E- g% ^1 ?! J& `8 A. M# q( Z8 d: k
#include "sdl.h" 4 e* @; _4 p3 C
#include "SDL_image.h"
5 z* J7 f7 K u: i* K#include "sfont.h"
8 e( Z: K6 S6 S% f" w( @4 V4 K6 N/ _9 C
//--------------------------------------------------------------------------- 8 @ _! d7 @ N/ L; q
#define STDOUT_FILE "stdout.txt"
0 K3 K* M$ p% |" D7 T#define STDERR_FILE "stderr.txt" + s" f* W7 q8 L% R& f
3 `& ?2 h( F9 H1 G
SDL_Surface *screen;
/ K2 o9 Y8 I( h7 Z4 Y. o( n+ R$ zUint32 fps;
+ X# M8 ^$ G1 hUint32 AppStartTime = 0;
5 ~7 j5 e5 B! q6 x V3 }( |5 ^4 |Uint32 frame_count = 0; : O4 u3 O0 Y) U% e2 t' n
static Uint32 frames;
5 l( w" Q8 s: x8 r! F4 W% X; W5 b0 p7 J4 a
SDL_Event event; r, [2 L! ]' P6 W
SDL_Surface * SetMode( int Width, int Height, int BPP, int Flags ); 5 H! `& ^7 t5 n3 O6 e' a& U8 c
SDL_Surface * LoadBMP( char * filename ); " G; B1 ^, B4 A6 k2 O
void MainLoops( int ( * EventFunc)( ), void ( * DrawFunc )( ), int DelayTime ); 3 ~; [: t" I7 V9 y2 r0 {" F
void Blt( SDL_Surface * image, int x, int y );
; z) y1 Q* L1 o# K( ]8 K, ovoid TileBlt( SDL_Surface * image, int x, int y ); B6 Z3 s) \6 _
void SetTransparentColor( SDL_Surface * sprite, int R, int G, int B );
5 E' z7 C- s+ j' k+ c9 [5 ^# Gvoid IoRedirect( );
$ M, x* Q h3 g& @5 l4 jvoid cleanup_output( ); 4 e- A) n0 [9 x+ A# V2 B+ J
void initfps(); 8 [) {5 \6 T; F: ]: `6 ^0 l! u
: I- {) R4 o" {. Z! F//--------------------------------------------------------------------------- ! s. r& |0 N. ~- `! t, z
Uint8 HZK12[574560]; # l6 e+ C/ x) D4 y+ B
Uint8 HZK14[670320];
9 q5 n* {8 \ T# kUint8 HZK16[766080];
4 d5 \/ A' D( _6 _" C& k, ?BOOL HZ_Init(); ( a: G/ f" Q0 @* R
BOOL HZ_TextOut( SDL_Surface * image, int x, int y, int width, int space, unsigned char * str );
6 s2 U2 N/ n0 e/ }% M$ [//---------------------------------------------------------------------------
& u+ Q+ m# ?2 A+ T/ k0 X1 K
6 a ]; `+ m5 F7 p5 e5 yint ProcessEvent( );
# E9 B6 c1 o- \( }void DrawFrame( );
. i* H, {! i! s: x: F" e+ b! W( S7 R
SDL_Surface * bg, * font; ' E Q5 |* A* k
int ix, iy, jx, jy; ) S0 m5 v- ]1 A: ^* j4 M
int Width = 640; 2 r, \+ W# [: V8 k/ k8 w
int Height = 480; 3 i; C$ P6 h1 m, I" @* H* u
int bpp = 16;
! g0 S" s6 ]1 i: ~) Q0 Pint ScreenMode = 0; 5 O! z) [9 s ~
9 |3 w$ ]% P4 B- ?' \WINAPI WinMain(HINSTANCE hInstPre, HINSTANCE hInstance, LPSTR cmd, int xxx ) , R( ?& B. {4 b/ ~$ m5 g
{ 9 ~* E5 I( A3 v
char TimeString[256];
/ J" l) g2 g* F/ ^time_t timer; " Y; l7 E# w8 R. V% {; P, B$ d
struct tm *tblock;
" [: W. l2 M. ]+ L7 ]
* C- G; L$ \3 yHZ_Init();
c4 k$ l% u; B8 \" n4 Z$ t3 [IoRedirect( );
, M9 q7 _* r4 Z& U p& _: _, qframes = 0;
. N) {4 I1 R1 ]$ Q3 m, }* ^) Mtimer = time(NULL); 0 ]# X( I; O. o/ _! d
tblock = localtime(&timer); 1 O$ B$ X0 k) f" E
strftime( TimeString, 256, "Time=%Z: %Y-%m-%d %a %H:%M:%S", tblock ); + o4 i7 Q7 Z5 T) y
printf( "%s\\n", TimeString ); _0 u- L6 Z% C6 z% e. W+ e3 E
" u4 }: I5 M' W X8 D
SetMode( Width, Height, bpp, SDL_SWSURFACE|ScreenMode ); " E$ X1 C2 {8 L' ^6 A x
SDL_ShowCursor(0);
$ C, l [( H. _7 G+ e& @! W5 mSDL_WM_SetCaption( "demo", "demo" );
7 a# K' C( M' h# }, W% O$ |" Z6 Y9 d/ X+ s5 t0 n. l
bg = IMG_Load( ".\\\\2k_bg.gif" ); & U6 Q4 T1 S, R
font = IMG_Load( ".\\\\small.gif" ); ' `+ N0 m' T! L/ B1 ?5 i6 W( M: j: J
" }0 A# K0 f2 i/ w. w: {$ W
InitFont(font); * E& W/ I5 Q. V6 Y1 j
SDL_SetAlpha( font, SDL_SRCALPHA|SDL_RLEACCEL, 127 ); $ ^1 v& J1 L% t: w
% g: I; }+ q4 ^/ h( `9 }! }5 P
ix=iy=0; # b& L+ U/ y. b7 f1 d+ {4 R$ @. n
jx=jy= Height>>1;
4 }# j. V3 Y) Hsrand( (Uint32)timer ); 2 K4 l' x" \5 h r; k) j$ y7 W
% ]9 O0 `0 ]. s3 m( }& }
MainLoops( ProcessEvent, DrawFrame, 0 ); 5 ^- P3 w" r6 |( q- B
7 J' Q U+ \8 _/ H! K$ x w) @6 B
printf( "ScreenMode=%d*%d*%d\\nFPS=%u", Width, Height, bpp, fps ); % f1 E) s( }0 m0 L5 I2 ^
# {3 j* N0 v. Z6 }# ]' W7 oreturn 0; 8 Y# |) T6 c2 p L; P
}
4 y) N/ @( U( \% v& j H' _: S' `7 N0 K( ?& D$ I' c) k
int ProcessEvent( ) . \/ }1 S# ~" W: G0 x+ S
{
* i7 q7 l* e) IUint8 *keystate; ; A1 A' \% `: l" C/ U2 e
+ }& A6 f3 H* ~, x+ h
keystate = SDL_GetKeyState( NULL ); ) _3 [# P) H9 t9 ~
if ( ( keystate[SDLK_ESCAPE] ) || ( keystate[SDLK_q] ) ) & S. S- z7 \: [: Q( m$ U
return 0;
3 |# Z5 t/ c" ~% f0 u, M2 J. Fif ( keystate[SDLK_F4] ) ) s5 {0 D# ~/ G; q' N/ `* c
{
N: ], O4 I$ V. w( t) ~$ ^if ( ScreenMode ) & @# @" A& n# F6 p* n- r, }0 ]
ScreenMode = 0;
4 E: q9 E9 G# G5 s! E8 r- y; nelse
! p& H% v' g8 x$ TScreenMode = SDL_FULLSCREEN;
' S, @+ Z2 G! g$ M' r
) }2 o: ^* W+ Q5 i! M2 r1 XSetMode( Width, Height, bpp, SDL_SWSURFACE|ScreenMode );
?+ X; E- [0 H* Y* S% z# \" h; P. ^8 Iinitfps( ); - z, y) O" \4 u, m$ `
} " }( T/ U( \( ?7 b) Q0 s
, z1 a4 e% d( T n w2 ~/ ^1 Z+ {4 qreturn 1;
0 |2 p9 V( z/ @1 [; @# f8 E- J}
3 j: z5 |1 m4 u) x: i: f; i
1 V* h3 [4 k$ I. }0 pvoid DrawFrame( )
2 X* [* w0 i3 V5 ]6 V1 D{
6 }6 z- n7 h- uchar tmp[256]; - b r) c" c! r8 ]) l/ {) A g
int step = 4; 7 G c/ r" Q6 t2 D' K
( K! j" t5 }1 d! \/ u
// $ p# c9 i" V1 I: k9 F! o
sprintf( tmp, "TotalFrame=%u", frames );
' B9 A" U( P6 e5 c- e, J( p2 N( L% z8 c7 a! m n
TileBlt( bg, 0, 0 );
+ R$ _& J: o1 `1 }
2 z% q- }% h' C: S, R( p" GSDL_SetAlpha( font, SDL_SRCALPHA|SDL_RLEACCEL, 4 ); . e& n) l( r+ L
PutString( screen, ix % Width - 6, iy % Height - 6, tmp );
0 k5 }8 z9 @3 j* q' E g* hSDL_SetAlpha( font, SDL_SRCALPHA|SDL_RLEACCEL, 8 );
" D3 j7 U& |$ `PutString( screen, ix % Width - 5, iy % Height - 5, tmp ); : a" e! ?. f5 o( I) q
SDL_SetAlpha( font, SDL_SRCALPHA|SDL_RLEACCEL, 16 ); 7 |; m. ~0 @" n m6 r( B1 d
PutString( screen, ix % Width - 4, iy % Height - 4, tmp );
$ t) N' H \& u4 v* Z& w4 ESDL_SetAlpha( font, SDL_SRCALPHA|SDL_RLEACCEL, 32 ); + \1 ]" [& g, }
PutString( screen, ix % Width - 3, iy % Height - 3, tmp );
7 j7 v% G% s, y& r( O! \! Y8 cSDL_SetAlpha( font, SDL_SRCALPHA|SDL_RLEACCEL, 64 );
) V) `& ?2 E2 }4 w7 @( `* _PutString( screen, ix % Width - 2, iy % Height - 2, tmp );
# D7 j% H- _5 W3 [SDL_SetAlpha( font, SDL_SRCALPHA|SDL_RLEACCEL, 128 );
) p% e: Z: m1 q8 b# t% E8 SPutString( screen, ix % Width - 1, iy % Height - 1, tmp );
( w# s" w$ [# J" E+ T5 f8 @SDL_SetAlpha( font, SDL_SRCALPHA|SDL_RLEACCEL, 192 ); 6 d, L8 Z# Q) E6 K( g! R+ V
PutString( screen, ix % Width, iy % Height, tmp );
+ c" g; i9 G* ~: g$ M) q
f9 I1 s: C! n3 I9 \6 ~$ GPutString( screen, ix % Width, iy % Height + 40, tmp );
$ u& n5 C1 w( V7 r) m
) P% j6 W$ q9 P+ V6 b6 A* _if ( rand( ) % 400 < 2 ) 6 Q' M5 ]# K S$ k- a4 j
{
. E4 W; } O, C' Z9 w' T& Jjx = rand( ) % ( Width - 10 ); 6 y' F/ J2 s" B+ b$ H
jy = rand( ) % ( Height - 10 ); 7 ]2 A" T! y$ D0 r
}
5 Y" `; h' c, u; [' C) Z
1 R9 h5 ~0 z* ]6 ?1 b2 B2 ssprintf( tmp, "FPS=%d", fps );
% S- P( ?( F8 U5 d, W; {4 @) o! q' qPutString( screen, 7, 7, tmp ); , ~7 m, Q) J4 q7 c6 _
//聞波,2000 ( f+ H! s5 H/ V
HZ_TextOut( screen, 10, 300, 16, 0, "十步殺一人,千里不留行"); " z" J; k. \% B% Y) P$ I) k' o
HZ_TextOut( screen, 10, 318, 14, 0, "十步殺一人,千里不留行" ); ) `% K+ o' Q- Y8 P' z/ j% F
HZ_TextOut( screen, 10, 334, 12, 0, "十步殺一人,千里不留行" ); ; v" w6 r: w& U/ w8 p8 @9 ~. s' x6 `
ix += step;
5 F& t9 j) \9 i) p* aiy += step;
+ h& D4 [( y0 t( _$ y5 k3 }. X} 8 o4 ]! b$ L R. E2 Q+ h: r/ Z0 a
//---------------------------------------------------------------------------
`8 k! f: a% b- X; Q
1 n6 A e4 ~& k* z# C0 u1 D1 m: [' v: q//--------------------------------------------------------------------------- + f0 R) I5 r; M( |- g
SDL_Surface * SetMode( int Width, int Height, int BPP, int Flags )
" e# l# Y* C+ I% |5 M. }; u7 d{
# c& I. m6 ^4 h( h: F; u/* Initialize the SDL library */ ' U- l3 G) S( ^
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
' h4 q- [# ~: x{
# h$ Z% L+ \1 J* x# X: k+ w+ @8 Kfprintf(stderr, "Couldn't initialize SDL: %s\\n", SDL_GetError( ) );
& P8 c2 Z0 ~1 o* I' ]return NULL;
( C0 A! J) E6 C# D# p9 `}
. l8 n0 D; ^8 i: S
6 i6 \6 d9 l7 t/* Clean up on exit */ 1 k7 ` L* L* W/ P1 c$ R5 n
atexit(SDL_Quit); ) d4 i1 {5 r! H1 g7 Z5 P
* ?6 H2 d/ C9 T
/* Initialize the display in a 640x480 8-bit palettized mode */ 0 J. E6 F2 H+ a, o) T4 @. r, Z
screen = SDL_SetVideoMode( Width, Height, BPP, Flags );
) g- k# o' [) K$ ~# t* Oif ( screen == NULL ) 8 ^4 L- u& C) F) }+ L
{ 4 n, r0 _* g+ X* ~' w0 y- P
fprintf( stderr, "Couldn't set %dx%dx%d video mode: %s\\n", Width, Height, BPP, SDL_GetError( ) );
: G" Z" A# w W7 G" M. s. j}
Y" j, e5 n8 F) x i J+ } v I6 d0 p b& W" Z4 G% P$ A
return screen; 0 o) h: P% X5 F. l
}
3 H- s1 I: L: v; G: W//--------------------------------------------------------------------------- a3 r4 X V2 T
! R; ?" k3 K, R9 e% X6 z4 {void initfps( ) 6 K' P8 y! f4 X7 a
{
* y$ s) P4 ?# @( k" bAppStartTime = SDL_GetTicks(); , G h" ?' A& P' ^* H1 b- t
frame_count = 0; ! o; O/ r1 a; y7 l7 ]: M( k( K8 w1 ]& I
} 4 x3 a8 K( t* S+ f1 f4 I: c
//---------------------------------------------------------------------------
' R2 v6 ~0 ~7 L. ]8 C3 E7 ? ^* Y' v/ Q
void MainLoops( int ( * EventFunc)( ), void ( * DrawFunc)( ), int DelayTime ) * |8 h" j/ b# o4 `5 r) X
{
" z: S7 O- u+ M0 \: @" iif ( EventFunc&&DrawFunc )
- K; L3 V6 n% p; m6 p{ 6 } T. s- F! q O4 y, ~$ P
memset( &event, 0, sizeof( SDL_Event ) );
- }2 U0 F, g z- U! R6 O3 Ninitfps( );
6 K* j2 p- Y. m: U; J7 A3 b6 M( X6 g( @. ?9 Y- d7 D3 m3 r
while( EventFunc( ) )
+ P' W: t0 p& p+ \! A; g; @0 g( b& @{ ! e* q$ G. x4 _; o
SDL_PollEvent(&event);
* H. ^. r; M/ ]5 d# \$ Y. E z7 M7 Nif ( event.type == SDL_ACTIVEEVENT ) ( [. ?& E. r* E
{ 9 E* @* k6 U h1 @& E* m* L& N+ S
if ( ( ( event.active.state & SDL_APPACTIVE ) == FALSE ) ||
1 D. p& k% @9 U S3 ?( event.active.gain == FALSE ) )
+ T& T& T5 C9 ainitfps( );
9 Q# X" X: F4 |} ) U6 ]/ Z4 T( N" Z, N f6 _* q1 L! T( n
SDL_PumpEvents();
$ x: X7 Y. J8 c3 ODrawFunc( ); ' c5 m: h+ I" {: ?, o
SDL_UpdateRect(screen,0, 0, 0, 0);
2 H- n1 n: \3 yframe_count ++;
% v) {& |% O/ [; z) ^frames ++; * k; F7 C' ]8 ~! V6 u
fps = frame_count * 1000 / ( SDL_GetTicks( ) - AppStartTime ); : k2 o; @2 N2 b% q l+ g
if ( DelayTime ) SDL_Delay( DelayTime ); + r2 f+ ]; A# f/ T$ ?4 S' C
}
' x' z& K& `/ P0 Y7 |} 6 t2 ?1 r- i( Y# x% O8 x
} ) Y8 H3 b( c" A4 A- K
//---------------------------------------------------------------------------
0 i0 s6 d. z( j: N B# x6 e& }( S% P" P3 L
SDL_Surface * LoadBMP( char * filename ) - _0 N8 w4 L7 `' o3 \
{
/ Z7 A6 X# U- H1 m+ \- dSDL_Surface * imagebmp, * image;
. _. w; S }# p: F- K5 B6 h* f/ w h8 |0 G" S% h6 `
imagebmp = SDL_LoadBMP( filename ); u+ @3 A' h7 y' s
if ( imagebmp == NULL ) ; y) e9 v0 [6 U( C6 h" C, M3 F
return NULL; # x4 `; @/ @' h) |$ E9 S
# o I9 I8 { B
if ( imagebmp->format->palette != NULL )
3 Y& H" ^- e6 ^( o4 N; p& j+ a6 B{ 5 j& }9 h3 O+ V. O# ~
SDL_SetColors( screen, imagebmp->format->palette->colors, 0, imagebmp->format->palette->ncolors );
" }) H- E2 q" [# f& i8 ^* A+ c% h J} i* d& B2 \% T" W+ I6 j2 s
, @8 r( K" D7 W. J0 _2 ]! Q/* Convert the image to the video format (maps colors) */ - ]. h a# A3 y9 l9 ` p; V9 X
image = SDL_DisplayFormat( imagebmp ); 9 a1 H, h g: s' i- L
SDL_FreeSurface( imagebmp );
! |6 F$ S/ r2 m) ]
9 \- V1 Y4 [; V" ^5 |return image; ( W' u9 I0 ~( N% m! h. q
} . |; o4 \' i- s7 `
//---------------------------------------------------------------------------
% P9 P0 {: k: ~# T- T' x
& U0 o: b8 N; \ Q& u6 ^. @) v6 hvoid Blt( SDL_Surface * image, int x, int y )
, h" Y r* [5 }1 P1 k9 ^{
) r# V3 _9 q4 q( i1 eint Row, Col, r, c, shiftx, shifty; 2 F3 x8 x% W" v* g7 c9 K
SDL_Rect dest, src;
; k/ n! @& r) [4 O9 }) D
/ T7 ^& S4 k" j/ \; N+ J/* out of screen */
7 K8 t5 x. Y# tif ( ( x > screen->w ) || ( y > screen->h ) ||
- ^, I# Y2 K" L* w% ~' x0 V( x + image->w < 1 ) || ( y + image->h < 1 ) ) . E, k- o, J7 Q
return;
. ]) V {9 c1 L
% j; p2 x& J- d- ]src.x = 0; : e. a8 [0 i/ H6 s0 ?
src.y = 0; 1 a3 ]1 I0 X# |3 v+ L% [6 \
src.w = image->w;
. p" z9 R% I/ I8 E7 M% Nsrc.h = image->h;
" O0 `5 j( ?6 \% ^. M1 z; k" Jdest.x = x;
1 M5 }0 X [: [( F, ^. Adest.y = y;
4 r* v. O% i Y5 ?dest.w = src.w;
+ V" \7 k$ G3 @if ( y < 0 ) ( x1 F1 H% t1 @7 [6 \# J
{ ; ~; q% X# S6 @9 R
src.y = 0 - y; 1 Q1 X; u! ` _3 Z2 ^
src.h = image->h + src.y; ' m6 V. H5 A0 i: M% F% u; R
dest.y = 0; ( [ p: K* S9 d$ K' O
}
0 o4 ?# M+ }- C adest.h = src.h;
. P7 ^& |* M F6 n) r1 Y7 b
/ j3 L, z/ j. m/ D& j- HSDL_BlitSurface( image, &src, screen, &dest ); : M( k4 [6 \4 y' e0 C
} + o) X, {' }- V! t
//---------------------------------------------------------------------------
9 n4 I9 H" O, ?7 j2 b( n$ p) M) a3 M6 c' N- r
void TileBlt( SDL_Surface * image, int x, int y ) " L- z, r, K$ f' L
{
7 A1 T% Z) }5 ^& _ N% Gint Row, Col, r, c, shiftx, shifty;
- m# k( ~' I" b6 ` d) Y% Q7 \7 b5 vSDL_Rect dest, src;
* n9 o! A# K8 u% x1 p- R4 J( D2 j/ y- a7 J
shiftx = x % image->w; ) Q- j: x& o0 m* B3 b
shifty = y % image->h;
( o$ q @; c) p/ r/ ^# v7 p; O3 G5 S4 ]5 n0 h: J1 {" B" e! m
if ( shiftx >0 ) shiftx -= image->w;
0 x9 n3 h& `/ R* G- W9 R- \if ( shifty >0 ) shifty -= image->h;
3 Q J: g: I% |5 y; _0 `& x9 l' N' G4 h" y" H
Row = screen->h / image->h + 2;
: G: K0 |, w7 A; H! CCol = screen->w / image->w + 2;
" K, G7 @. Y& O" E6 W& O3 P6 F: A
2 ?5 ?% t4 O' h9 A% a6 x5 W- }dest.x = 0; 0 }; r5 C# }3 ^5 q M. S
dest.y = 0;
' q/ E# n" p- p/ A: A. Bdest.w = image->w; 3 _. n0 V* `$ ~
dest.h = image->h;
, u) u! q' ]% Rsrc.x = 0; 1 ]0 [7 Z8 ^3 f; E
src.y = 0;
7 G9 M: b! P/ Q: y& ^. Vsrc.w = image->w;
& o+ H w; u m* }% R" T5 \src.h = image->h;
b+ q3 A0 b2 p1 h! V0 {0 K4 y3 ]3 l
for ( r = 0; r < Row; r ++ ) $ u; d( w/ i4 g) Q0 a, `) w! @
{
; L! D; i4 K9 Q X2 |if ( r )
: S3 K1 C" ]0 o) N8 Z9 V# V{
+ y6 | A: o @+ J, }- Csrc.y = 0; , M2 x3 ~7 H! ^1 _
src.h = image->h; , s* F% ~% u% U) V& S
dest.h = image->h; " H$ c U( b; I
dest.y = image->h * r + shifty; 9 K$ D4 i4 w7 ]) s% A
} . c* i2 W0 Q. W3 l$ L- d5 h8 t% w
else
! [/ y' r/ s' G- r{ /* first line ? */
, T/ t% _4 }: [* L0 L, W. asrc.y = 0 - shifty;
% p3 T. o# N& X# l* D3 |src.h = image->h; * [( e4 r- I9 k! _
dest.h = image->h + shifty;
- G1 D" _* Z# M' L7 B& w% u- \dest.y = 0; 3 T. S9 j9 ?! @
}
9 `; V ]. F- k) j: e: s) q# i3 X7 H, r7 ]) i& z1 n& ]9 g
for ( c = 0; c < Col; c ++ ) + I2 ~ I! W) X8 s; B f
{
1 b7 d4 h$ T3 N( v/ @: bdest.x = image->w * c + shiftx;
* z, |3 H! u4 { D; MSDL_BlitSurface( image, &src, screen, &dest ); 7 D; M1 t0 |3 m6 W" _1 a/ @& _! ^
} . H& D( I- t& J
}
/ x9 v9 u/ |- l}
' t" j9 w8 o4 ~' t//--------------------------------------------------------------------------- / o/ ^, e) v% A4 m1 K. e! x
) j+ `( v: E# Z( w4 i
void SetTransparentColor( SDL_Surface * sprite, int R, int G, int B )
7 F5 l! }( d1 d8 ~' Y{ 3 K. U F0 H- K5 @9 s7 y ?% d' q
SDL_SetColorKey( sprite, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB( sprite->format, R, G, B ) );
, c& G7 Z0 b& D! m3 `/ c} ; E: G- I+ _1 n/ f# _$ n6 _9 q
//--------------------------------------------------------------------------- * R* Q! y, S# G
7 i- g e+ H( ~$ K! J# ~7 k/* Remove the output files if there was no output written */
7 y+ t2 c$ R; ^ Qstatic void cleanup_output( ) $ X" `) F. f, A t j
{ - n4 Q: @; w( X8 o' B
FILE *file; / B( t/ V: n2 l) @
int empty;
% ~0 R; U, T0 C
8 a8 t& f. ]1 S' y( S0 j& s/* Flush the output in case anything is queued */
, P6 j" u+ `+ Afclose(stdout);
+ q5 ?, p5 d6 q! z8 W" i6 Lfclose(stderr);
' q4 V, h3 y5 d( @; Y6 F) r& T" z2 d- X# Z( W
/* See if the files have any output in them */
" H6 O7 N0 `" B( Y: Ifile = fopen(STDOUT_FILE, "rb");
( Y7 A% j6 O1 h! M' U7 fif ( file )
7 K' g9 ^* k$ k0 p6 }- r e{
6 V8 v& E0 |1 M* c, u5 m L3 Zempty = (fgetc(file) == EOF) ? 1 : 0; 0 G$ z) A, V- h; l5 a5 f
fclose(file);
' V1 g8 x$ F- q" f {; Y9 ?if ( empty ) 3 M# a9 J/ u* u
remove(STDOUT_FILE);
9 T$ u4 T: z$ W8 A! }}
9 }! l9 A" {$ Ufile = fopen(STDERR_FILE, "rb");
! t) f( y4 x* ~5 t& u6 lif ( file ) 1 s* E3 S# E; J5 u1 s( X
{
( L/ b0 o. P5 l" ^5 d* L" Mempty = (fgetc(file) == EOF) ? 1 : 0; 4 u+ r0 G8 i2 |$ D( i5 _* T
fclose(file); 8 ~" r9 F4 _# t) z& Z
if ( empty ) 4 }8 y- m7 b8 c1 |, o( Y
remove(STDERR_FILE); ( d2 M$ D2 E" F5 V: a. c: F
}
( s9 S. b6 r' q& e- T4 m0 ~}
* l) P& |; k$ k, o( U9 z4 t# ^//--------------------------------------------------------------------------- 6 O3 A {, ~" W! a) }
" H% v' B9 n, G) x6 X6 ?
void IoRedirect( )
& p$ ~# R K; P+ l" h2 {. d{
0 i7 S" Y. t, N/ w# D$ I$ fFILE *newfp;
/ R' h/ P' P$ [: j
/ m4 R3 s" u5 o u/ B+ [/* Redirect standard standard output */ ( C0 N, f+ v. ^+ N9 }+ A+ B7 U% {
newfp = freopen(STDOUT_FILE, "w", stdout);
1 a6 W7 `4 h9 ^: X3 k8 Bif ( newfp == NULL ) + G" |) t- V, p% s; w5 x, H! h q& Y. H
{ /* This happens on NT */
2 m+ D4 [6 X/ Y1 D#if !defined(stdout) g% w: s/ u3 k, U' ^
stdout = fopen(STDOUT_FILE, "w"); ) q' e4 e; _: l, w" [
#else
) @2 A' U$ N, G" z/ D, R2 Cnewfp = fopen(STDOUT_FILE, "w");
+ n4 d& E2 y% X5 N2 \if ( newfp ) *stdout = *newfp;
0 F# Q5 @1 A5 d# H#endif 9 s% i! Q8 L4 a3 @; h0 ^
}
3 `/ P+ T7 y6 x9 L5 t- P! S# q0 s
" b% C- B: E' Z! G7 r/* Redirect standard standard error */ 7 @1 K# \* E* r
newfp = freopen(STDERR_FILE, "w", stderr);
( ` Y! j: ~) q6 ]; i% D4 S! bif ( newfp == NULL )
: C/ C) a; d6 o8 u1 n{ /* This happens on NT */
3 D4 B6 T; M& G) g#if !defined(stderr) 8 w7 L9 @# C$ c( d
stderr = fopen(STDERR_FILE, "w"); 9 f7 F9 s' u. }- ]) l8 G" q
#else 4 I% F" ^9 l* ]" Z4 l1 |2 t
newfp = fopen(STDERR_FILE, "w");
2 A x% N' a( }4 b4 v, Wif ( newfp ) *stderr = *newfp;
: m' V7 T4 |1 \2 B#endif 7 k9 j5 _7 S) a _4 `
}
& o! w' n3 N' V$ @7 _( m$ }
+ K" B, u/ t, i9 K3 ?setvbuf(stdout, NULL, _IOLBF, BUFSIZ); /* Line buffered */
( k4 F0 W+ ^) B. G. S" P) Tsetbuf(stderr, NULL); /* No buffering */ % l& l! f% D4 X6 e& f9 p4 Y4 `5 Y
atexit(cleanup_output);
8 v. q2 T. [' G4 t}
; s2 t/ K# Y8 y. w* b2 R6 M//---------------------------------------------------------------------------
3 D+ G4 J( _/ T N+ N, R( j3 Y
# _9 t$ ?* Q2 S2 ZBOOL HZ_Init()
$ B0 B K. g; C0 {{
& F1 M* |0 {& [/ u6 t# _# _FILE * file; # m3 @; S* m8 m
; S% o; I$ ]+ A6 `( n- gfile = fopen( ".\\\\HZK16.GBK", "rb" ); ; O; v1 {% D$ j" m
fread( HZK16, 32, 0x5d84, file );
/ d: ]: Q% I7 [% @fclose( file ); + P) z, {" e2 V( q; A' o# S( M
file = fopen( ".\\\\HZK14.GBK", "rb" );
3 r- B8 J Y+ [/ c/ x0 Lfread( HZK14, 28, 0x5d84, file );
" k1 E- e1 h8 W% @( j1 Ffclose( file );
1 l5 L: N& t" C# |, }! r: Y) _& B, rfile = fopen( ".\\\\HZK12.GBK", "rb" );
4 j5 @* [# T" r' Z" _8 ^: U q. W5 E- Z, Hfread( HZK12, 24, 0x5d84, file );
; e2 X" L( ~$ C6 j. g0 Z% Vfclose( file );
. e: |1 S* n" n7 y7 R
1 k7 s1 {7 @! A5 Z! K% Ureturn TRUE;
$ ?5 R8 c( C+ j# A3 T, R3 N: i7 ^* f1 w}
1 l3 z* s/ x! t- v2 Z/ k, |1 A//--------------------------------------------------------------------------- 2 X9 J) f$ M" j- D
9 m6 O" \8 M7 ~$ y+ yBOOL HZ_TextOut( SDL_Surface * image, int x, int y, int width, int space, unsigned char * str ) 6 }4 E# T9 c' G# v0 F9 w
{
$ O9 s0 Z4 }4 _2 ?% r1 Z }Uint8 * bufptr;
) n+ @ G0 u. e. nUint8 * HZK;
' K/ Y5 ^6 S: }. c/ {- NUint16 Bits[16]; # U1 Z2 T1 |& p. \/ y( {% f0 T
int i,j,k, m, offset = 0; 2 O2 h# d2 i; G) [# G/ ]
unsigned char q; ( e! B9 `/ v& N8 x2 g8 t
unsigned char w; . z {' i% ]" p! M5 _7 H! x
^1 h! b! j: _4 M
switch ( width )
2 j# @- o" j; {; {0 Q' a{ 8 d& _/ @2 U8 @" Y% D
case 12: 8 c+ t/ o& {+ G) i9 p8 o: C- i) I
HZK = HZK12; 6 G. U/ l7 u4 B6 ^' E. _
break; + j3 k8 F; H' O" Z8 Y4 y
case 14: 7 k0 f" _+ d* H
HZK = HZK14;
$ N# W7 k: B. E! ]% Xbreak;
# U* p E& y: R, z1 o# F/ t; L' rcase 16: . c+ F$ H$ E2 @( I8 P
HZK = HZK16; 2 f- P: j5 d! Y7 T
break; " B2 O# `2 u& E p K$ a
default: % C) ?4 I/ a) i# ?1 x5 `
return FALSE; " P! b/ ^ h! p; B
} . d! |3 k2 |( u* _$ l" ^* H) {) s
bufptr = (unsigned char*)image->pixels;
: S# g& }) a* k6 H& q/ b0 o
& @& B& k5 w# F$ ym = strlen( str ); 8 k- E1 ~5 ^( T8 Q: _5 |
for ( k = 0; k < m; k +=2 ) 8 |6 F8 M; F' j
{ + i- S% X$ g1 [5 z' Y
Uint32 X, Y, Z, M; 5 X+ E% ~3 Z; j4 p6 b! p5 {
q = str[k]; & [8 f9 n, u& ?$ `
w = str[k+1]; . m) N- f; ~, Z) i8 r, o
! e F, R1 \5 y) Q$ G+ a' J1 @$ `
if ( w > 0xa0 ) ; p8 U5 B+ N0 H/ j
{ ( [& Z* ^$ V3 j: S! c
M = 0x5e;
- p# z/ ]4 J' `0 d+ S1 P( RY = w - 0xa1;
0 q3 _' _5 F/ w3 I T; N# jif ( q > 0xa0 ) , B3 D+ _3 m! ^1 K; I4 V& r7 m
{
: X4 g2 A& E6 ~2 l; eX = q - 0xa1;
3 U. S3 L2 E8 a# U" I. eZ = 0; & A& S2 e; \( m
} % k" }( B$ J! @& f6 Y7 i. n
else
: w# s4 @7 P0 ^8 M+ I/ S{ . F8 V% j: d5 \) f' _5 V
X = q - 0x81;
3 v+ y" \8 c9 k" x- F0 N& i) [: R) }Z = 0x2284;
* S; T* e* M" }$ r( U8 X9 O' m} 9 y7 o) @1 _, O, ^, F7 W& Q; F+ R( F
} ) C) C: t1 ?7 Y6 J* d' g( O
else i$ x, x, t% L+ d) t
{ 8 O7 U: D. \ V3 D5 N
M = 0x60; / c% S) ]2 D r! A9 N
if ( w > 0x7f ) Y = w - 0x41; + i0 X+ g0 E+ S/ h$ Z0 e
else Y = w - 0x40; ) g3 I0 B! r ^/ c% i. v
3 K; |& S9 V$ D6 i {% j4 qif ( q > 0xa0 ) ; N0 ]. l; x% P* g% P
{ 1 E% E. S' X b4 t& T& ~
X = q - 0xa1; + \! G; i$ Y- {7 R. W& x: F% J
Z = 0x3a44;
6 ^0 Z$ C. d6 ]3 x1 b( P} 8 ?' P1 F, ^5 f, v' |) w7 k
else , C" q n( F8 Q
{
( y8 o( u% H2 c. dX = q - 0x81;
, O# q$ w8 K% x f, I1 [; fZ = 0x2e44;
# |! @( p1 W* C6 M} * v: `' Q$ n r% O6 R
} $ q7 Z4 P2 ^3 p( W$ X
memcpy( Bits, HZK + ( X * M + Y + Z ) * width * 2, width * 2 );
. b1 k) @3 @6 D/ ^! K, P$ j, Q5 ^- r$ B' V# @$ q* E
for ( i = 0; i < width; i ++ ) // row ! @0 \7 `8 X3 x
{
6 M. A# d/ W" Q* b2 y) j0 M% T8 Q- wUint16 line; , T( O! ^5 W8 \" h" K. |) `6 m
2 }0 d l* n8 z! D, w2 @
line = Bits[ i ]; ( l" K6 K E* ]/ p3 o* r
line = ( line >> 8 ) + ( line << 8 ); # v! m5 e- a5 g5 _3 [! a! j
3 m1 ?5 i# L1 U
for ( j = 0; j < 16 ; j ++ ) //col " S& Y9 d, ?/ G: S
{ % o) ?$ o* I8 D! g K) s) q
int index;
1 y6 m! e; W% x- ?int mask = 1;
, y B. X# u% u: C5 S4 ?7 w4 t, {% D2 h3 {
index = offset + x + 16 - j - 1 + ( y + i ) * image->pitch / image->format->BytesPerPixel; 1 x& p! w. O( h4 m$ h
mask <<= j; # O! }6 ~* i" g. G8 s) N/ A/ t
if ( mask & line )
~# c6 w: G |& E7 d{ - e9 G7 b3 D/ ` Y! c3 ~0 w
bufptr[ index * 2 ] = 0xff; * O+ X5 p- M/ W( @$ j9 Q3 S
bufptr[ index * 2 + 1 ] = 0xff; : `5 Y, z& B( k$ H! c# _
} & `1 e- W' }) E8 @5 n' _+ u! D
}
- `. U; O6 L N! `: F, P}
! ]7 R( ?' A/ t, X: goffset += width + space; 4 c; T, \5 Z0 \: K/ S; Y
} " i- H1 E% [! Z6 G3 F9 t9 ^
return TRUE;
: v5 n1 z2 c& a* K0 d' r} |