raze/polymer/eduke32/source/osdfuncs.c
helixhorned 44904b12be Clean up picanm[] by making its elements values of struct type picanm_t.
The size of that struct is currently 4, and its layout almost the same as
what is read in with loadpics().  The number of tiles in an animation is
bumped to 256, so that the max. tile difference in DEF's animtilerange is
255. (There's no way to have such animations from ART.)

git-svn-id: https://svn.eduke32.com/eduke32@3202 1a8010ca-5511-0410-912e-c29ae57300e0
2012-11-17 19:46:28 +00:00

193 lines
5 KiB
C

//-------------------------------------------------------------------------
/*
Copyright (C) 2010 EDuke32 developers and contributors
This file is part of EDuke32.
EDuke32 is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
//-------------------------------------------------------------------------
#include "duke3d.h"
#include "build.h"
#include "namesdyn.h"
#include "osdfuncs.h"
#include "premap.h"
int32_t osdhightile = 0;
void GAME_drawosdchar(int32_t x, int32_t y, char ch, int32_t shade, int32_t pal)
{
int16_t ac;
#ifndef USE_OPENGL
int32_t usehightile = 0;
#endif
int32_t ht = usehightile;
if (ch == 32) return;
ac = ch-'!'+STARTALPHANUM;
if (ac < STARTALPHANUM || ac > ENDALPHANUM) return;
usehightile = (osdhightile && ht);
rotatesprite_fs(((x<<3)+x)<<16, (y<<3)<<16, 65536l, 0, ac, shade, pal, 8|16);
usehightile = ht;
}
void GAME_drawosdstr(int32_t x, int32_t y, char *ch, int32_t len, int32_t shade, int32_t pal)
{
int16_t ac;
char *ptr = OSD_GetTextPtr();
char *fmt = OSD_GetFmtPtr();
#ifndef USE_OPENGL
int32_t usehightile = 0;
#endif
int32_t ht = usehightile;
usehightile = (osdhightile && ht);
x = (x<<3)+x;
if (ch > ptr && ch < (ptr + TEXTSIZE))
{
do
{
if (*ch == 32)
{
x += OSDCHAR_WIDTH+1;
ch++;
continue;
}
ac = *ch-'!'+STARTALPHANUM;
if (ac < STARTALPHANUM || ac > ENDALPHANUM) { usehightile = ht; return; }
// use the format byte if the text falls within the bounds of the console buffer
rotatesprite_fs(x<<16, (y<<3)<<16, 65536, 0, ac, (*(ch-ptr+fmt)&~0x1F)>>4,
*(ch-ptr+fmt)&~0xE0, 8|16);
x += OSDCHAR_WIDTH+1;
ch++;
}
while (--len);
usehightile = ht;
return;
}
do
{
if (*ch == 32)
{
x += OSDCHAR_WIDTH+1;
ch++;
continue;
}
ac = *ch-'!'+STARTALPHANUM;
if (ac < STARTALPHANUM || ac > ENDALPHANUM) { usehightile = ht; return; }
rotatesprite_fs(x<<16, (y<<3)<<16, 65536, 0, ac, shade, pal, 8|16);
x += OSDCHAR_WIDTH+1;
ch++;
}
while (--len);
usehightile = ht;
}
void GAME_drawosdcursor(int32_t x, int32_t y, int32_t type, int32_t lastkeypress)
{
int16_t ac;
if (type) ac = SMALLFNTCURSOR;
else ac = '_'-'!'+STARTALPHANUM;
if (!((GetTime()-lastkeypress) & 0x40l))
rotatesprite_fs(((x<<3)+x)<<16, ((y<<3)+(type?-1:2))<<16, 65536l, 0, ac, 0, 8, 8|16);
}
int32_t GAME_getcolumnwidth(int32_t w)
{
return w/9;
}
int32_t GAME_getrowheight(int32_t w)
{
return w>>3;
}
//#define BGTILE 311
//#define BGTILE 1156
#define BGTILE 1141 // BIGHOLE
#define BGTILE_SIZEX 128
#define BGTILE_SIZEY 128
#define BORDTILE 3250 // VIEWBORDER
#define BITSTH 1+32+8+16 // high translucency
#define BITSTL 1+8+16 // low translucency
#define BITS 8+16+64 // solid
#define SHADE 0
#define PALETTE 4
void GAME_onshowosd(int32_t shown)
{
// fix for TCs like Layre which don't have the BGTILE for some reason
// most of this is copied from my dummytile stuff in defs.c
if (!tilesizx[BGTILE] || !tilesizy[BGTILE])
{
set_tilesiz(BGTILE, BGTILE_SIZEX, BGTILE_SIZEY);
Bmemset(&picanm[BGTILE], 0, sizeof(picanm_t));
faketilesiz[BGTILE] = -1;
}
G_UpdateScreenArea();
if (numplayers == 1 && ((shown && !ud.pause_on) || (!shown && ud.pause_on)))
KB_KeyDown[sc_Pause] = 1;
}
void GAME_clearbackground(int32_t c, int32_t r)
{
int32_t x, y, xsiz, ysiz, tx2, ty2;
int32_t daydim, bits;
UNREFERENCED_PARAMETER(c);
if (getrendermode() < 3) bits = BITS;
else bits = BITSTL;
daydim = r<<3;
xsiz = tilesizx[BGTILE];
ysiz = tilesizy[BGTILE];
if (xsiz <= 0 || ysiz <= 0)
return;
tx2 = xdim/xsiz;
// ty2 = ydim/ysiz;
ty2 = daydim/ysiz;
for (x=tx2; x>=0; x--)
for (y=ty2; y>=0; y--)
// for (y=ty2+1;y>=1;y--)
// rotatesprite(x*xsiz<<16,((daydim-ydim)+(y*ysiz))<<16,65536L,0,BGTILE,SHADE,PALETTE,bits,0,0,xdim,daydim);
rotatesprite(x*xsiz<<16,y*ysiz<<16,65536L,0,BGTILE,SHADE,PALETTE,bits,0,0,xdim,daydim);
xsiz = tilesizy[BORDTILE];
if (xsiz <= 0)
return;
tx2 = xdim/xsiz;
ysiz = tilesizx[BORDTILE];
for (x=tx2; x>=0; x--)
rotatesprite(x*xsiz<<16,(daydim+ysiz+1)<<16,65536L,1536,BORDTILE,SHADE-12,PALETTE,BITS,0,0,xdim,daydim+ysiz+1);
}