Added fighters.
This commit is contained in:
parent
f8d54e66db
commit
00d604820d
@ -210,7 +210,8 @@
|
|||||||
#define PT_CLST 155
|
#define PT_CLST 155
|
||||||
#define PT_WIRE 156
|
#define PT_WIRE 156
|
||||||
#define PT_GBMB 157
|
#define PT_GBMB 157
|
||||||
#define PT_NUM 158
|
#define PT_FIGH 158
|
||||||
|
#define PT_NUM 159
|
||||||
|
|
||||||
#define R_TEMP 22
|
#define R_TEMP 22
|
||||||
#define MAX_TEMP 9999
|
#define MAX_TEMP 9999
|
||||||
@ -327,6 +328,7 @@ int update_CLST(UPDATE_FUNC_ARGS);
|
|||||||
int update_DLAY(UPDATE_FUNC_ARGS);
|
int update_DLAY(UPDATE_FUNC_ARGS);
|
||||||
int update_WIRE(UPDATE_FUNC_ARGS);
|
int update_WIRE(UPDATE_FUNC_ARGS);
|
||||||
int update_GBMB(UPDATE_FUNC_ARGS);
|
int update_GBMB(UPDATE_FUNC_ARGS);
|
||||||
|
int update_FIGH(UPDATE_FUNC_ARGS);
|
||||||
int update_CO2(UPDATE_FUNC_ARGS);
|
int update_CO2(UPDATE_FUNC_ARGS);
|
||||||
int update_CBNW(UPDATE_FUNC_ARGS);
|
int update_CBNW(UPDATE_FUNC_ARGS);
|
||||||
int update_STOR(UPDATE_FUNC_ARGS);
|
int update_STOR(UPDATE_FUNC_ARGS);
|
||||||
@ -574,6 +576,7 @@ static const part_type ptypes[PT_NUM] =
|
|||||||
{"CLST", PIXPACK(0xE4A4A4), 0.7f, 0.02f * CFDS, 0.94f, 0.95f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Clay dust. Produces paste when mixed with water.", ST_SOLID, TYPE_PART, &update_CLST},
|
{"CLST", PIXPACK(0xE4A4A4), 0.7f, 0.02f * CFDS, 0.94f, 0.95f, 0.0f, 0.2f, 0.00f, 0.000f * CFDS, 1, 0, 0, 2, 2, 1, 1, 55, SC_POWDERS, R_TEMP+0.0f +273.15f, 70, "Clay dust. Produces paste when mixed with water.", ST_SOLID, TYPE_PART, &update_CLST},
|
||||||
{"WIRE", PIXPACK(0xFFCC00), 0.0f, 0.00f * CFDS, 0.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 250, "WireWorld wires.",ST_SOLID,TYPE_SOLID,&update_WIRE},
|
{"WIRE", PIXPACK(0xFFCC00), 0.0f, 0.00f * CFDS, 0.00f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 250, "WireWorld wires.",ST_SOLID,TYPE_SOLID,&update_WIRE},
|
||||||
{"GBMB", PIXPACK(0x1144BB), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 20, 1, 1, 30, SC_EXPLOSIVE, R_TEMP-2.0f +273.15f, 29, "Sticks to first object it touches then produces strong gravity push.", ST_NONE, TYPE_PART|PROP_LIFE_DEC|PROP_LIFE_KILL_DEC, &update_GBMB},
|
{"GBMB", PIXPACK(0x1144BB), 0.6f, 0.01f * CFDS, 0.98f, 0.95f, 0.0f, 0.1f, 0.00f, 0.000f * CFDS, 1, 0, 0, 0, 20, 1, 1, 30, SC_EXPLOSIVE, R_TEMP-2.0f +273.15f, 29, "Sticks to first object it touches then produces strong gravity push.", ST_NONE, TYPE_PART|PROP_LIFE_DEC|PROP_LIFE_KILL_DEC, &update_GBMB},
|
||||||
|
{"FIGH", PIXPACK(0x000000), 0.5f, 0.00f * CFDS, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.00f * CFDS, 0, 0, 0, 0, 0, 1, 1, 50, SC_SPECIAL, R_TEMP+14.6f+273.15f, 0, "Fighter. Tries to kill stickmans.", ST_NONE, 0, &update_FIGH},
|
||||||
//Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Use Weight Section H Ins Description
|
//Name Colour Advec Airdrag Airloss Loss Collid Grav Diffus Hotair Fal Burn Exp Mel Hrd M Use Weight Section H Ins Description
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -747,6 +750,7 @@ static part_transition ptransitions[PT_NUM] =
|
|||||||
/* CLST */ {IPL, NT, IPH, NT, ITL, NT, 1256.0f, PT_LAVA},
|
/* CLST */ {IPL, NT, IPH, NT, ITL, NT, 1256.0f, PT_LAVA},
|
||||||
/* WIRE */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT},
|
/* WIRE */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT},
|
||||||
/* GBMB */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT},
|
/* GBMB */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT},
|
||||||
|
/* FIGH */ {IPL, NT, IPH, NT, ITL, NT, 620.0f, PT_FIRE},
|
||||||
};
|
};
|
||||||
#undef IPL
|
#undef IPL
|
||||||
#undef IPH
|
#undef IPH
|
||||||
@ -977,6 +981,9 @@ extern int gravwl_timeout;
|
|||||||
extern float player[29];
|
extern float player[29];
|
||||||
extern float player2[29];
|
extern float player2[29];
|
||||||
|
|
||||||
|
extern float fighters[256][28];
|
||||||
|
extern unsigned char fighcount;
|
||||||
|
|
||||||
extern int gravityMode;
|
extern int gravityMode;
|
||||||
extern int airMode;
|
extern int airMode;
|
||||||
|
|
||||||
|
7
src/elements/figh.c
Normal file
7
src/elements/figh.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#include <element.h>
|
||||||
|
|
||||||
|
int update_FIGH(UPDATE_FUNC_ARGS)
|
||||||
|
{
|
||||||
|
run_stickman(fighters[(unsigned char)parts[i].tmp], UPDATE_FUNC_SUBCALL_ARGS);
|
||||||
|
return 0;
|
||||||
|
}
|
539
src/graphics.c
539
src/graphics.c
@ -1023,19 +1023,97 @@ inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a)
|
|||||||
ba >>= 2;
|
ba >>= 2;
|
||||||
bn -= 2;
|
bn -= 2;
|
||||||
}
|
}
|
||||||
return x + w;
|
return x + w;
|
||||||
}
|
}
|
||||||
|
|
||||||
int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a)
|
int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a)
|
||||||
{
|
{
|
||||||
#ifdef OpenGL
|
#ifdef OpenGL
|
||||||
#else
|
#else
|
||||||
int sx = x;
|
int sx = x;
|
||||||
for (; *s; s++)
|
for (; *s; s++)
|
||||||
|
{
|
||||||
|
if (*s == '\n')
|
||||||
|
{
|
||||||
|
x = sx;
|
||||||
|
y += FONT_H+2;
|
||||||
|
}
|
||||||
|
else if (*s == '\b')
|
||||||
|
{
|
||||||
|
switch (s[1])
|
||||||
|
{
|
||||||
|
case 'w':
|
||||||
|
r = g = b = 255;
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
r = g = b = 192;
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
r = 255;
|
||||||
|
g = 216;
|
||||||
|
b = 32;
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
r = 255;
|
||||||
|
g = b = 0;
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
r = g = 0;
|
||||||
|
b = 255;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
b = 255;
|
||||||
|
g = 170;
|
||||||
|
r = 32;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Draw text with an outline
|
||||||
|
int drawtext_outline(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a, int or, int og, int ob, int oa)
|
||||||
|
{
|
||||||
|
drawtext(vid, x-1, y-1, s, or, og, ob, oa);
|
||||||
|
drawtext(vid, x+1, y+1, s, or, og, ob, oa);
|
||||||
|
|
||||||
|
drawtext(vid, x-1, y+1, s, or, og, ob, oa);
|
||||||
|
drawtext(vid, x+1, y-1, s, or, og, ob, oa);
|
||||||
|
|
||||||
|
return drawtext(vid, x, y, s, r, g, b, a);
|
||||||
|
}
|
||||||
|
int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, int b, int a)
|
||||||
|
{
|
||||||
|
#ifdef OpenGL
|
||||||
|
#else
|
||||||
|
int sx = x;
|
||||||
|
int rh = 12;
|
||||||
|
int rw = 0;
|
||||||
|
int cw = x;
|
||||||
|
int wordlen;
|
||||||
|
int charspace;
|
||||||
|
while (*s)
|
||||||
|
{
|
||||||
|
wordlen = strcspn(s," .,!?\n");
|
||||||
|
charspace = textwidthx((char *)s, w-(x-cw));
|
||||||
|
if (charspace<wordlen && wordlen && w-(x-cw)<w/3)
|
||||||
|
{
|
||||||
|
x = sx;
|
||||||
|
rw = 0;
|
||||||
|
y+=FONT_H+2;
|
||||||
|
rh+=FONT_H+2;
|
||||||
|
}
|
||||||
|
for (; *s && --wordlen>=-1; s++)
|
||||||
{
|
{
|
||||||
if (*s == '\n')
|
if (*s == '\n')
|
||||||
{
|
{
|
||||||
x = sx;
|
x = sx;
|
||||||
|
rw = 0;
|
||||||
y += FONT_H+2;
|
y += FONT_H+2;
|
||||||
}
|
}
|
||||||
else if (*s == '\b')
|
else if (*s == '\b')
|
||||||
@ -1065,56 +1143,13 @@ int drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a
|
|||||||
r = g = 0;
|
r = g = 0;
|
||||||
b = 255;
|
b = 255;
|
||||||
break;
|
break;
|
||||||
case 't':
|
|
||||||
b = 255;
|
|
||||||
g = 170;
|
|
||||||
r = 32;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Draw text with an outline
|
|
||||||
int drawtext_outline(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a, int or, int og, int ob, int oa)
|
|
||||||
{
|
|
||||||
drawtext(vid, x-1, y-1, s, or, og, ob, oa);
|
|
||||||
drawtext(vid, x+1, y+1, s, or, og, ob, oa);
|
|
||||||
|
|
||||||
drawtext(vid, x-1, y+1, s, or, og, ob, oa);
|
|
||||||
drawtext(vid, x+1, y-1, s, or, og, ob, oa);
|
|
||||||
|
|
||||||
return drawtext(vid, x, y, s, r, g, b, a);
|
|
||||||
}
|
|
||||||
int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, int b, int a)
|
|
||||||
{
|
|
||||||
#ifdef OpenGL
|
|
||||||
#else
|
|
||||||
int sx = x;
|
|
||||||
int rh = 12;
|
|
||||||
int rw = 0;
|
|
||||||
int cw = x;
|
|
||||||
int wordlen;
|
|
||||||
int charspace;
|
|
||||||
while (*s)
|
|
||||||
{
|
{
|
||||||
wordlen = strcspn(s," .,!?\n");
|
|
||||||
charspace = textwidthx((char *)s, w-(x-cw));
|
if (x-cw>=w)
|
||||||
if (charspace<wordlen && wordlen && w-(x-cw)<w/3)
|
|
||||||
{
|
|
||||||
x = sx;
|
|
||||||
rw = 0;
|
|
||||||
y+=FONT_H+2;
|
|
||||||
rh+=FONT_H+2;
|
|
||||||
}
|
|
||||||
for (; *s && --wordlen>=-1; s++)
|
|
||||||
{
|
|
||||||
if (*s == '\n')
|
|
||||||
{
|
{
|
||||||
x = sx;
|
x = sx;
|
||||||
rw = 0;
|
rw = 0;
|
||||||
@ -1167,36 +1202,38 @@ int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, i
|
|||||||
}
|
}
|
||||||
x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a);
|
x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a);
|
||||||
}
|
}
|
||||||
|
x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return rh;
|
return rh;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
//draws a rectange, (x,y) are the top left coords.
|
//draws a rectange, (x,y) are the top left coords.
|
||||||
void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a)
|
void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a)
|
||||||
{
|
{
|
||||||
#ifdef OpenGL
|
#ifdef OpenGL
|
||||||
glBegin(GL_LINE_LOOP);
|
glBegin(GL_LINE_LOOP);
|
||||||
glColor4ub(r, g, b, a);
|
glColor4ub(r, g, b, a);
|
||||||
glVertex2i(x, y);
|
glVertex2i(x, y);
|
||||||
glVertex2i(x+w, y);
|
glVertex2i(x+w, y);
|
||||||
glVertex2i(x+w, y+h);
|
glVertex2i(x+w, y+h);
|
||||||
glVertex2i(x, y+h);
|
glVertex2i(x, y+h);
|
||||||
glEnd();
|
glEnd();
|
||||||
#else
|
#else
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<=w; i++)
|
for (i=0; i<=w; i++)
|
||||||
{
|
{
|
||||||
drawpixel(vid, x+i, y, r, g, b, a);
|
drawpixel(vid, x+i, y, r, g, b, a);
|
||||||
drawpixel(vid, x+i, y+h, r, g, b, a);
|
drawpixel(vid, x+i, y+h, r, g, b, a);
|
||||||
}
|
}
|
||||||
for (i=1; i<h; i++)
|
for (i=1; i<h; i++)
|
||||||
{
|
{
|
||||||
drawpixel(vid, x, y+i, r, g, b, a);
|
drawpixel(vid, x, y+i, r, g, b, a);
|
||||||
drawpixel(vid, x+w, y+i, r, g, b, a);
|
drawpixel(vid, x+w, y+i, r, g, b, a);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1204,16 +1241,16 @@ void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a
|
|||||||
void fillrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a)
|
void fillrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a)
|
||||||
{
|
{
|
||||||
#ifdef OpenGL
|
#ifdef OpenGL
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
glColor4ub(r, g, b, a);
|
glColor4ub(r, g, b, a);
|
||||||
glVertex2i(x, y);
|
glVertex2i(x, y);
|
||||||
glVertex2i(x+w, y);
|
glVertex2i(x+w, y);
|
||||||
glVertex2i(x+w, y+h);
|
glVertex2i(x+w, y+h);
|
||||||
glVertex2i(x, y+h);
|
glVertex2i(x, y+h);
|
||||||
glEnd();
|
glEnd();
|
||||||
#else
|
#else
|
||||||
int i,j;
|
int i,j;
|
||||||
for (j=1; j<h; j++)
|
for (j=1; j<h; j++)
|
||||||
for (i=1; i<w; i++)
|
for (i=1; i<w; i++)
|
||||||
drawpixel(vid, x+i, y+j, r, g, b, a);
|
drawpixel(vid, x+i, y+j, r, g, b, a);
|
||||||
#endif // OpenGL
|
#endif // OpenGL
|
||||||
@ -1221,70 +1258,70 @@ void fillrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a
|
|||||||
|
|
||||||
void clearrect(pixel *vid, int x, int y, int w, int h)
|
void clearrect(pixel *vid, int x, int y, int w, int h)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i=1; i<h; i++)
|
for (i=1; i<h; i++)
|
||||||
memset(vid+(x+1+(XRES+BARSIZE)*(y+i)), 0, PIXELSIZE*(w-1));
|
memset(vid+(x+1+(XRES+BARSIZE)*(y+i)), 0, PIXELSIZE*(w-1));
|
||||||
}
|
}
|
||||||
//draws a line of dots, where h is the height. (why is this even here)
|
//draws a line of dots, where h is the height. (why is this even here)
|
||||||
void drawdots(pixel *vid, int x, int y, int h, int r, int g, int b, int a)
|
void drawdots(pixel *vid, int x, int y, int h, int r, int g, int b, int a)
|
||||||
{
|
{
|
||||||
#ifdef OpenGL
|
#ifdef OpenGL
|
||||||
int i;
|
int i;
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
glColor4ub(r, g, b, a);
|
glColor4ub(r, g, b, a);
|
||||||
for (i = 0; i <= h; i +=2)
|
for (i = 0; i <= h; i +=2)
|
||||||
glVertex2i(x, y+i);
|
glVertex2i(x, y+i);
|
||||||
glEnd();
|
glEnd();
|
||||||
#else
|
#else
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<=h; i+=2)
|
for (i=0; i<=h; i+=2)
|
||||||
drawpixel(vid, x, y+i, r, g, b, a);
|
drawpixel(vid, x, y+i, r, g, b, a);
|
||||||
#endif //OpenGL
|
#endif //OpenGL
|
||||||
}
|
}
|
||||||
|
|
||||||
int textwidth(char *s)
|
int textwidth(char *s)
|
||||||
{
|
{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
for (; *s; s++)
|
for (; *s; s++)
|
||||||
x += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
x += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
||||||
return x-1;
|
return x-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int drawtextmax(pixel *vid, int x, int y, int w, char *s, int r, int g, int b, int a)
|
int drawtextmax(pixel *vid, int x, int y, int w, char *s, int r, int g, int b, int a)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
w += x-5;
|
w += x-5;
|
||||||
for (; *s; s++)
|
for (; *s; s++)
|
||||||
{
|
{
|
||||||
if (x+font_data[font_ptrs[(int)(*(unsigned char *)s)]]>=w && x+textwidth(s)>=w+5)
|
if (x+font_data[font_ptrs[(int)(*(unsigned char *)s)]]>=w && x+textwidth(s)>=w+5)
|
||||||
break;
|
break;
|
||||||
x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a);
|
x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a);
|
||||||
}
|
}
|
||||||
if (*s)
|
if (*s)
|
||||||
for (i=0; i<3; i++)
|
for (i=0; i<3; i++)
|
||||||
x = drawchar(vid, x, y, '.', r, g, b, a);
|
x = drawchar(vid, x, y, '.', r, g, b, a);
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
int textnwidth(char *s, int n)
|
int textnwidth(char *s, int n)
|
||||||
{
|
{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
for (; *s; s++)
|
for (; *s; s++)
|
||||||
{
|
{
|
||||||
if (!n)
|
if (!n)
|
||||||
break;
|
break;
|
||||||
x += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
x += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
||||||
n--;
|
n--;
|
||||||
}
|
}
|
||||||
return x-1;
|
return x-1;
|
||||||
}
|
}
|
||||||
void textnpos(char *s, int n, int w, int *cx, int *cy)
|
void textnpos(char *s, int n, int w, int *cx, int *cy)
|
||||||
{
|
{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int y = 0;
|
int y = 0;
|
||||||
int wordlen, charspace;
|
int wordlen, charspace;
|
||||||
while (*s&&n)
|
while (*s&&n)
|
||||||
{
|
{
|
||||||
wordlen = strcspn(s," .,!?\n");
|
wordlen = strcspn(s," .,!?\n");
|
||||||
charspace = textwidthx(s, w-x);
|
charspace = textwidthx(s, w-x);
|
||||||
if (charspace<wordlen && wordlen && w-x<w/3)
|
if (charspace<wordlen && wordlen && w-x<w/3)
|
||||||
@ -1305,29 +1342,29 @@ void textnpos(char *s, int n, int w, int *cx, int *cy)
|
|||||||
}
|
}
|
||||||
n--;
|
n--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*cx = x-1;
|
*cx = x-1;
|
||||||
*cy = y;
|
*cy = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
int textwidthx(char *s, int w)
|
int textwidthx(char *s, int w)
|
||||||
{
|
{
|
||||||
int x=0,n=0,cw;
|
int x=0,n=0,cw;
|
||||||
for (; *s; s++)
|
for (; *s; s++)
|
||||||
{
|
{
|
||||||
cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
||||||
if (x+(cw/2) >= w)
|
if (x+(cw/2) >= w)
|
||||||
break;
|
break;
|
||||||
x += cw;
|
x += cw;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
int textposxy(char *s, int width, int w, int h)
|
int textposxy(char *s, int width, int w, int h)
|
||||||
{
|
{
|
||||||
int x=0,y=0,n=0,cw, wordlen, charspace;
|
int x=0,y=0,n=0,cw, wordlen, charspace;
|
||||||
while (*s)
|
while (*s)
|
||||||
{
|
{
|
||||||
wordlen = strcspn(s," .,!?\n");
|
wordlen = strcspn(s," .,!?\n");
|
||||||
charspace = textwidthx(s, width-x);
|
charspace = textwidthx(s, width-x);
|
||||||
if (charspace<wordlen && wordlen && width-x<width/3)
|
if (charspace<wordlen && wordlen && width-x<width/3)
|
||||||
@ -1347,16 +1384,16 @@ int textposxy(char *s, int width, int w, int h)
|
|||||||
}
|
}
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
int textwrapheight(char *s, int width)
|
int textwrapheight(char *s, int width)
|
||||||
{
|
{
|
||||||
int x=0, height=FONT_H+2, cw;
|
int x=0, height=FONT_H+2, cw;
|
||||||
int wordlen;
|
int wordlen;
|
||||||
int charspace;
|
int charspace;
|
||||||
while (*s)
|
while (*s)
|
||||||
{
|
{
|
||||||
wordlen = strcspn(s," .,!?\n");
|
wordlen = strcspn(s," .,!?\n");
|
||||||
charspace = textwidthx(s, width-x);
|
charspace = textwidthx(s, width-x);
|
||||||
if (charspace<wordlen && wordlen && width-x<width/3)
|
if (charspace<wordlen && wordlen && width-x<width/3)
|
||||||
@ -1386,8 +1423,8 @@ int textwrapheight(char *s, int width)
|
|||||||
x += cw;
|
x += cw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return height;
|
return height;
|
||||||
}
|
}
|
||||||
|
|
||||||
//the most used function for drawing a pixel, because it has OpenGL support, which is not fully implemented.
|
//the most used function for drawing a pixel, because it has OpenGL support, which is not fully implemented.
|
||||||
@ -1424,30 +1461,30 @@ inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a)
|
|||||||
|
|
||||||
void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag)
|
void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag)
|
||||||
{
|
{
|
||||||
char t[2];
|
char t[2];
|
||||||
t[0] = ch;
|
t[0] = ch;
|
||||||
t[1] = 0;
|
t[1] = 0;
|
||||||
if (flag)
|
if (flag)
|
||||||
{
|
{
|
||||||
fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255);
|
fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255);
|
||||||
drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255);
|
drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255);
|
drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255);
|
||||||
drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255);
|
drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_air(pixel *vid)
|
void draw_air(pixel *vid)
|
||||||
{
|
{
|
||||||
int x, y, i, j;
|
int x, y, i, j;
|
||||||
pixel c;
|
pixel c;
|
||||||
|
|
||||||
if (cmode == CM_PERS)//this should never happen anyway
|
if (cmode == CM_PERS)//this should never happen anyway
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (y=0; y<YRES/CELL; y++)
|
for (y=0; y<YRES/CELL; y++)
|
||||||
for (x=0; x<XRES/CELL; x++)
|
for (x=0; x<XRES/CELL; x++)
|
||||||
{
|
{
|
||||||
if (cmode == CM_PRESS)
|
if (cmode == CM_PRESS)
|
||||||
@ -1512,9 +1549,9 @@ void draw_air(pixel *vid)
|
|||||||
|
|
||||||
void draw_grav_zones(pixel * vid)
|
void draw_grav_zones(pixel * vid)
|
||||||
{
|
{
|
||||||
int x, y, i, j;
|
int x, y, i, j;
|
||||||
for (y=0; y<YRES/CELL; y++)
|
for (y=0; y<YRES/CELL; y++)
|
||||||
{
|
{
|
||||||
for (x=0; x<XRES/CELL; x++)
|
for (x=0; x<XRES/CELL; x++)
|
||||||
{
|
{
|
||||||
if(gravmask[y][x])
|
if(gravmask[y][x])
|
||||||
@ -1527,7 +1564,7 @@ void draw_grav_zones(pixel * vid)
|
|||||||
drawpixel(vid, x*CELL+i, y*CELL+j, 32, 32, 32, 120);
|
drawpixel(vid, x*CELL+i, y*CELL+j, 32, 32, 32, 120);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_grav(pixel *vid)
|
void draw_grav(pixel *vid)
|
||||||
@ -1535,9 +1572,16 @@ void draw_grav(pixel *vid)
|
|||||||
int x, y, i, ca;
|
int x, y, i, ca;
|
||||||
float nx, ny, dist;
|
float nx, ny, dist;
|
||||||
|
|
||||||
for (y=0; y<YRES/CELL; y++)
|
for (y=0; y<YRES/CELL; y++)
|
||||||
{
|
{
|
||||||
for (x=0; x<XRES/CELL; x++)
|
for (x=0; x<XRES/CELL; x++)
|
||||||
|
{
|
||||||
|
if(fabsf(gravx[y][x]) <= 0.001f && fabsf(gravy[y][x]) <= 0.001f)
|
||||||
|
continue;
|
||||||
|
nx = x*CELL;
|
||||||
|
ny = y*CELL;
|
||||||
|
dist = fabsf(gravx[y][x])+fabsf(gravy[y][x]);
|
||||||
|
for(i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
ca = ((y*CELL)*XRES)+(x*CELL);
|
ca = ((y*CELL)*XRES)+(x*CELL);
|
||||||
if(fabsf(gravpf[ca]) <= 0.001f && fabsf(gravyf[ca]) <= 0.001f)
|
if(fabsf(gravpf[ca]) <= 0.001f && fabsf(gravyf[ca]) <= 0.001f)
|
||||||
@ -1554,30 +1598,31 @@ void draw_grav(pixel *vid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a) //Draws a line
|
void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a) //Draws a line
|
||||||
{
|
{
|
||||||
int dx, dy, i, sx, sy, check, e, x, y;
|
int dx, dy, i, sx, sy, check, e, x, y;
|
||||||
|
|
||||||
dx = abs(x1-x2);
|
dx = abs(x1-x2);
|
||||||
dy = abs(y1-y2);
|
dy = abs(y1-y2);
|
||||||
sx = isign(x2-x1);
|
sx = isign(x2-x1);
|
||||||
sy = isign(y2-y1);
|
sy = isign(y2-y1);
|
||||||
x = x1;
|
x = x1;
|
||||||
y = y1;
|
y = y1;
|
||||||
check = 0;
|
check = 0;
|
||||||
|
|
||||||
if (dy>dx)
|
if (dy>dx)
|
||||||
{
|
{
|
||||||
dx = dx+dy;
|
dx = dx+dy;
|
||||||
dy = dx-dy;
|
dy = dx-dy;
|
||||||
dx = dx-dy;
|
dx = dx-dy;
|
||||||
check = 1;
|
check = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
e = (dy<<2)-dx;
|
e = (dy<<2)-dx;
|
||||||
for (i=0; i<=dx; i++)
|
for (i=0; i<=dx; i++)
|
||||||
{
|
{
|
||||||
if (x>=0 && y>=0 && x<a && y<YRES+MENUSIZE)
|
if (x>=0 && y>=0 && x<a && y<YRES+MENUSIZE)
|
||||||
vid[x+y*a] =PIXRGB(r, g, b);
|
vid[x+y*a] =PIXRGB(r, g, b);
|
||||||
if (e>=0)
|
if (e>=0)
|
||||||
@ -1593,76 +1638,76 @@ void draw_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b,
|
|||||||
else
|
else
|
||||||
x = x+sx;
|
x = x+sx;
|
||||||
e = e+(dy<<2);
|
e = e+(dy<<2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//adds color to a pixel, does not overwrite.
|
//adds color to a pixel, does not overwrite.
|
||||||
void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a)
|
void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a)
|
||||||
{
|
{
|
||||||
pixel t;
|
pixel t;
|
||||||
if (x<0 || y<0 || x>=XRES || y>=YRES)
|
if (x<0 || y<0 || x>=XRES || y>=YRES)
|
||||||
return;
|
return;
|
||||||
t = vid[y*(XRES+BARSIZE)+x];
|
t = vid[y*(XRES+BARSIZE)+x];
|
||||||
r = (a*r + 255*PIXR(t)) >> 8;
|
r = (a*r + 255*PIXR(t)) >> 8;
|
||||||
g = (a*g + 255*PIXG(t)) >> 8;
|
g = (a*g + 255*PIXG(t)) >> 8;
|
||||||
b = (a*b + 255*PIXB(t)) >> 8;
|
b = (a*b + 255*PIXB(t)) >> 8;
|
||||||
if (r>255)
|
if (r>255)
|
||||||
r = 255;
|
r = 255;
|
||||||
if (g>255)
|
if (g>255)
|
||||||
g = 255;
|
g = 255;
|
||||||
if (b>255)
|
if (b>255)
|
||||||
b = 255;
|
b = 255;
|
||||||
vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b);
|
vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b);
|
||||||
}
|
}
|
||||||
|
|
||||||
//draws one of two colors, so that it is always clearly visible
|
//draws one of two colors, so that it is always clearly visible
|
||||||
void xor_pixel(int x, int y, pixel *vid)
|
void xor_pixel(int x, int y, pixel *vid)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
if (x<0 || y<0 || x>=XRES || y>=YRES)
|
if (x<0 || y<0 || x>=XRES || y>=YRES)
|
||||||
return;
|
return;
|
||||||
c = vid[y*(XRES+BARSIZE)+x];
|
c = vid[y*(XRES+BARSIZE)+x];
|
||||||
c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c);
|
c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c);
|
||||||
if (c<512)
|
if (c<512)
|
||||||
vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0);
|
vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0);
|
||||||
else
|
else
|
||||||
vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040);
|
vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040);
|
||||||
}
|
}
|
||||||
|
|
||||||
//same as xor_pixel, but draws a line of it
|
//same as xor_pixel, but draws a line of it
|
||||||
void xor_line(int x1, int y1, int x2, int y2, pixel *vid)
|
void xor_line(int x1, int y1, int x2, int y2, pixel *vid)
|
||||||
{
|
{
|
||||||
int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy;
|
int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy;
|
||||||
float e, de;
|
float e, de;
|
||||||
if (cp)
|
if (cp)
|
||||||
{
|
{
|
||||||
y = x1;
|
y = x1;
|
||||||
x1 = y1;
|
x1 = y1;
|
||||||
y1 = y;
|
y1 = y;
|
||||||
y = x2;
|
y = x2;
|
||||||
x2 = y2;
|
x2 = y2;
|
||||||
y2 = y;
|
y2 = y;
|
||||||
}
|
}
|
||||||
if (x1 > x2)
|
if (x1 > x2)
|
||||||
{
|
{
|
||||||
y = x1;
|
y = x1;
|
||||||
x1 = x2;
|
x1 = x2;
|
||||||
x2 = y;
|
x2 = y;
|
||||||
y = y1;
|
y = y1;
|
||||||
y1 = y2;
|
y1 = y2;
|
||||||
y2 = y;
|
y2 = y;
|
||||||
}
|
}
|
||||||
dx = x2 - x1;
|
dx = x2 - x1;
|
||||||
dy = abs(y2 - y1);
|
dy = abs(y2 - y1);
|
||||||
e = 0.0f;
|
e = 0.0f;
|
||||||
if (dx)
|
if (dx)
|
||||||
de = dy/(float)dx;
|
de = dy/(float)dx;
|
||||||
else
|
else
|
||||||
de = 0.0f;
|
de = 0.0f;
|
||||||
y = y1;
|
y = y1;
|
||||||
sy = (y1<y2) ? 1 : -1;
|
sy = (y1<y2) ? 1 : -1;
|
||||||
for (x=x1; x<=x2; x++)
|
for (x=x1; x<=x2; x++)
|
||||||
{
|
{
|
||||||
if (cp)
|
if (cp)
|
||||||
xor_pixel(y, x, vid);
|
xor_pixel(y, x, vid);
|
||||||
else
|
else
|
||||||
@ -1673,43 +1718,43 @@ void xor_line(int x1, int y1, int x2, int y2, pixel *vid)
|
|||||||
y += sy;
|
y += sy;
|
||||||
e -= 1.0f;
|
e -= 1.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//same as blend_pixel, but draws a line of it
|
//same as blend_pixel, but draws a line of it
|
||||||
void blend_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a)
|
void blend_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a)
|
||||||
{
|
{
|
||||||
int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy;
|
int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy;
|
||||||
float e, de;
|
float e, de;
|
||||||
if (cp)
|
if (cp)
|
||||||
{
|
{
|
||||||
y = x1;
|
y = x1;
|
||||||
x1 = y1;
|
x1 = y1;
|
||||||
y1 = y;
|
y1 = y;
|
||||||
y = x2;
|
y = x2;
|
||||||
x2 = y2;
|
x2 = y2;
|
||||||
y2 = y;
|
y2 = y;
|
||||||
}
|
}
|
||||||
if (x1 > x2)
|
if (x1 > x2)
|
||||||
{
|
{
|
||||||
y = x1;
|
y = x1;
|
||||||
x1 = x2;
|
x1 = x2;
|
||||||
x2 = y;
|
x2 = y;
|
||||||
y = y1;
|
y = y1;
|
||||||
y1 = y2;
|
y1 = y2;
|
||||||
y2 = y;
|
y2 = y;
|
||||||
}
|
}
|
||||||
dx = x2 - x1;
|
dx = x2 - x1;
|
||||||
dy = abs(y2 - y1);
|
dy = abs(y2 - y1);
|
||||||
e = 0.0f;
|
e = 0.0f;
|
||||||
if (dx)
|
if (dx)
|
||||||
de = dy/(float)dx;
|
de = dy/(float)dx;
|
||||||
else
|
else
|
||||||
de = 0.0f;
|
de = 0.0f;
|
||||||
y = y1;
|
y = y1;
|
||||||
sy = (y1<y2) ? 1 : -1;
|
sy = (y1<y2) ? 1 : -1;
|
||||||
for (x=x1; x<=x2; x++)
|
for (x=x1; x<=x2; x++)
|
||||||
{
|
{
|
||||||
if (cp)
|
if (cp)
|
||||||
blendpixel(vid, y, x, r, g, b, a);
|
blendpixel(vid, y, x, r, g, b, a);
|
||||||
else
|
else
|
||||||
@ -1720,23 +1765,23 @@ void blend_line(pixel *vid, int x1, int y1, int x2, int y2, int r, int g, int b,
|
|||||||
y += sy;
|
y += sy;
|
||||||
e -= 1.0f;
|
e -= 1.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//same as xor_pixel, but draws a rectangle
|
//same as xor_pixel, but draws a rectangle
|
||||||
void xor_rect(pixel *vid, int x, int y, int w, int h)
|
void xor_rect(pixel *vid, int x, int y, int w, int h)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<w; i+=2)
|
for (i=0; i<w; i+=2)
|
||||||
{
|
{
|
||||||
xor_pixel(x+i, y, vid);
|
xor_pixel(x+i, y, vid);
|
||||||
xor_pixel(x+i, y+h-1, vid);
|
xor_pixel(x+i, y+h-1, vid);
|
||||||
}
|
}
|
||||||
for (i=2; i<h; i+=2)
|
for (i=2; i<h; i+=2)
|
||||||
{
|
{
|
||||||
xor_pixel(x, y+i, vid);
|
xor_pixel(x, y+i, vid);
|
||||||
xor_pixel(x+w-1, y+i, vid);
|
xor_pixel(x+w-1, y+i, vid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_other(pixel *vid) // EMP effect
|
void draw_other(pixel *vid) // EMP effect
|
||||||
@ -1784,6 +1829,16 @@ void draw_parts(pixel *vid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (i = 0; i<=parts_lastActiveIndex; i++) {
|
for (i = 0; i<=parts_lastActiveIndex; i++) {
|
||||||
|
#ifdef OpenGL
|
||||||
|
if (cmode == CM_FANCY) //If fancy mode
|
||||||
|
{
|
||||||
|
if (ny%(4*GRID_MODE)==0)
|
||||||
|
blendpixel(vid, nx, ny, 100, 100, 100, 80);
|
||||||
|
if (nx%(4*GRID_MODE)==0)
|
||||||
|
blendpixel(vid, nx, ny, 100, 100, 100, 80);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 0; i<=parts_lastActiveIndex; i++) {
|
||||||
#ifdef OpenGL
|
#ifdef OpenGL
|
||||||
if (cmode == CM_FANCY) //If fancy mode
|
if (cmode == CM_FANCY) //If fancy mode
|
||||||
{
|
{
|
||||||
@ -1917,7 +1972,32 @@ void draw_parts(pixel *vid)
|
|||||||
draw_line(vid , nx, ny+3, player2[11], player2[12], 100, 100, 255, s);
|
draw_line(vid , nx, ny+3, player2[11], player2[12], 100, 100, 255, s);
|
||||||
draw_line(vid , player2[11], player2[12], player2[15], player2[16], 100, 100, 255, s);
|
draw_line(vid , player2[11], player2[12], player2[15], player2[16], 100, 100, 255, s);
|
||||||
}
|
}
|
||||||
if (cmode==CM_NOTHING && t!=PT_PIPE && t!=PT_SWCH && t!=PT_LCRY && t!=PT_PUMP && t!=PT_GPMP && t!=PT_PBCN && t!=PT_FILT && t!=PT_HSWC && t!=PT_PCLN && t!=PT_DEUT && t!=PT_WIFI && t!=PT_LIFE && t!=PT_PVOD)//nothing display but show needed color changes
|
else if (t==PT_FIGH) //Fighter should be visible in heat mode
|
||||||
|
{
|
||||||
|
char buff[10]; //Buffer for HP
|
||||||
|
pixel pc;
|
||||||
|
float *figh = fighters[(unsigned char)parts[i].tmp];
|
||||||
|
|
||||||
|
if (mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head
|
||||||
|
{
|
||||||
|
sprintf(buff, "%3d", parts[i].life); //Show HP
|
||||||
|
drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255);
|
||||||
|
}
|
||||||
|
if ((int)figh[2]<PT_NUM) pc = ptypes[(int)figh[2]].pcolors;
|
||||||
|
else pc = PIXPACK(0xFFFFFF);
|
||||||
|
s = XRES+BARSIZE;
|
||||||
|
//head
|
||||||
|
draw_line(vid , nx, ny+2, nx+2, ny, PIXR(pc), PIXG(pc), PIXB(pc), s);
|
||||||
|
draw_line(vid , nx+2, ny, nx, ny-2, PIXR(pc), PIXG(pc), PIXB(pc), s);
|
||||||
|
draw_line(vid , nx, ny-2, nx-2, ny, PIXR(pc), PIXG(pc), PIXB(pc), s);
|
||||||
|
draw_line(vid , nx-2, ny, nx, ny+2, PIXR(pc), PIXG(pc), PIXB(pc), s);
|
||||||
|
//legs
|
||||||
|
draw_line(vid , nx, ny+3, figh[3], figh[4], 255, 255, 255, s);
|
||||||
|
draw_line(vid , figh[3], figh[4], figh[7], figh[8], 255, 255, 255, s);
|
||||||
|
draw_line(vid , nx, ny+3, figh[11], figh[12], 255, 255, 255, s);
|
||||||
|
draw_line(vid , figh[11], figh[12], figh[15], figh[16], 255, 255, 255, s);
|
||||||
|
}
|
||||||
|
if (cmode==CM_NOTHING && t!=PT_PIPE && t!=PT_SWCH && t!=PT_LCRY && t!=PT_PUMP && t!=PT_GPMP && t!=PT_PBCN && t!=PT_FILT && t!=PT_HSWC && t!=PT_PCLN && t!=PT_DEUT && t!=PT_WIFI && t!=PT_LIFE)//nothing display but show needed color changes
|
||||||
{
|
{
|
||||||
if (t==PT_PHOT)
|
if (t==PT_PHOT)
|
||||||
{
|
{
|
||||||
@ -3835,6 +3915,29 @@ void draw_parts(pixel *vid)
|
|||||||
draw_line(vid , nx, ny+3, player2[11], player2[12], R, G, B, s);
|
draw_line(vid , nx, ny+3, player2[11], player2[12], R, G, B, s);
|
||||||
draw_line(vid , player2[11], player2[12], player2[15], player2[16], R, G, B, s);
|
draw_line(vid , player2[11], player2[12], player2[15], player2[16], R, G, B, s);
|
||||||
}
|
}
|
||||||
|
else if (t==PT_FIGH) //Fighter should be visible in heat mode
|
||||||
|
{
|
||||||
|
char buff[10]; //Buffer for HP
|
||||||
|
float *figh = fighters[(unsigned char)parts[i].tmp];
|
||||||
|
|
||||||
|
if (mousex>(nx-3) && mousex<(nx+3) && mousey<(ny+3) && mousey>(ny-3)) //If mous is in the head
|
||||||
|
{
|
||||||
|
sprintf(buff, "%3d", parts[i].life); //Show HP
|
||||||
|
drawtext(vid, mousex-8-2*(parts[i].life<100)-2*(parts[i].life<10), mousey-12, buff, 255, 255, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
s = XRES+BARSIZE;
|
||||||
|
//head
|
||||||
|
draw_line(vid , nx, ny+2, nx+2, ny, R, G, B, s);
|
||||||
|
draw_line(vid , nx+2, ny, nx, ny-2, R, G, B, s);
|
||||||
|
draw_line(vid , nx, ny-2, nx-2, ny, R, G, B, s);
|
||||||
|
draw_line(vid , nx-2, ny, nx, ny+2, R, G, B, s);
|
||||||
|
//legs
|
||||||
|
draw_line(vid , nx, ny+3, figh[3], figh[4], R, G, B, s);
|
||||||
|
draw_line(vid , figh[3], figh[4], figh[7], figh[8], R, G, B, s);
|
||||||
|
draw_line(vid , nx, ny+3, figh[11], figh[12], R, G, B, s);
|
||||||
|
draw_line(vid , figh[11], figh[12], figh[15], figh[16], R, G, B, s);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B);
|
vid[ny*(XRES+BARSIZE)+nx] = PIXRGB(R, G, B);
|
||||||
@ -4706,10 +4809,10 @@ pixel *prerender_save(void *save, int size, int *width, int *height)
|
|||||||
j=d[p++];
|
j=d[p++];
|
||||||
if (j<PT_NUM && j>0)
|
if (j<PT_NUM && j>0)
|
||||||
{
|
{
|
||||||
if (j==PT_STKM || j==PT_STKM2)
|
if (j==PT_STKM || j==PT_STKM2 || j==PT_FIGH)
|
||||||
{
|
{
|
||||||
pixel lc, hc=PIXRGB(255, 224, 178);
|
pixel lc, hc=PIXRGB(255, 224, 178);
|
||||||
if (j==PT_STKM) lc = PIXRGB(255, 255, 255);
|
if (j==PT_STKM || j==PT_FIGH) lc = PIXRGB(255, 255, 255);
|
||||||
else lc = PIXRGB(100, 100, 255);
|
else lc = PIXRGB(100, 100, 255);
|
||||||
//only need to check upper bound of y coord - lower bounds and x<w are checked in draw_line
|
//only need to check upper bound of y coord - lower bounds and x<w are checked in draw_line
|
||||||
draw_line(fb , x-2, y-2, x+2, y-2, PIXR(hc), PIXG(hc), PIXB(hc), w);
|
draw_line(fb , x-2, y-2, x+2, y-2, PIXR(hc), PIXG(hc), PIXB(hc), w);
|
||||||
|
10
src/main.c
10
src/main.c
@ -1113,6 +1113,8 @@ void clear_sim(void)
|
|||||||
memset(wireless, 0, sizeof(wireless));
|
memset(wireless, 0, sizeof(wireless));
|
||||||
memset(gol2, 0, sizeof(gol2));
|
memset(gol2, 0, sizeof(gol2));
|
||||||
memset(portalp, 0, sizeof(portalp));
|
memset(portalp, 0, sizeof(portalp));
|
||||||
|
memset(fighters, 0, sizeof(fighters));
|
||||||
|
fighcount = 0;
|
||||||
ISSPAWN1 = ISSPAWN2 = 0;
|
ISSPAWN1 = ISSPAWN2 = 0;
|
||||||
player[27] = 0;
|
player[27] = 0;
|
||||||
player2[27] = 0;
|
player2[27] = 0;
|
||||||
@ -3115,7 +3117,7 @@ int main(int argc, char *argv[])
|
|||||||
c = (b&1) ? sl : sr; //c is element to be spawned
|
c = (b&1) ? sl : sr; //c is element to be spawned
|
||||||
su = c;
|
su = c;
|
||||||
|
|
||||||
if (c!=WL_SIGN+100)
|
if (c!=WL_SIGN+100 && c!=PT_FIGH)
|
||||||
{
|
{
|
||||||
if (!bq)
|
if (!bq)
|
||||||
for (signi=0; signi<MAXSIGNS; signi++)
|
for (signi=0; signi<MAXSIGNS; signi++)
|
||||||
@ -3144,6 +3146,12 @@ int main(int argc, char *argv[])
|
|||||||
if (!bq)
|
if (!bq)
|
||||||
add_sign_ui(vid_buf, x, y);
|
add_sign_ui(vid_buf, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c==PT_FIGH)
|
||||||
|
{
|
||||||
|
if (!bq)
|
||||||
|
create_part(-1, x, y, PT_FIGH);
|
||||||
|
}
|
||||||
//for the click functions, lx and ly, are the positions of where the FIRST click happened. x,y are current mouse position.
|
//for the click functions, lx and ly, are the positions of where the FIRST click happened. x,y are current mouse position.
|
||||||
else if (lb)//lb means you are holding mouse down
|
else if (lb)//lb means you are holding mouse down
|
||||||
{
|
{
|
||||||
|
64
src/powder.c
64
src/powder.c
@ -16,6 +16,9 @@ int lighting_recreate = 0;
|
|||||||
float player[29];
|
float player[29];
|
||||||
float player2[29];
|
float player2[29];
|
||||||
|
|
||||||
|
float fighters[256][28]; //255 is the maximum number of fighters
|
||||||
|
unsigned char fighcount = 0; //Contains the number of fighters
|
||||||
|
|
||||||
particle *parts;
|
particle *parts;
|
||||||
particle *cb_parts;
|
particle *cb_parts;
|
||||||
|
|
||||||
@ -110,6 +113,7 @@ void init_can_move()
|
|||||||
//all stickman collisions are done in stickman update function
|
//all stickman collisions are done in stickman update function
|
||||||
can_move[PT_STKM][t] = 2;
|
can_move[PT_STKM][t] = 2;
|
||||||
can_move[PT_STKM2][t] = 2;
|
can_move[PT_STKM2][t] = 2;
|
||||||
|
can_move[PT_FIGH][t] = 2;
|
||||||
}
|
}
|
||||||
for (t=0;t<PT_NUM;t++)
|
for (t=0;t<PT_NUM;t++)
|
||||||
{
|
{
|
||||||
@ -120,6 +124,7 @@ void init_can_move()
|
|||||||
//all stickman collisions are done in stickman update function
|
//all stickman collisions are done in stickman update function
|
||||||
can_move[t][PT_STKM] = 2;
|
can_move[t][PT_STKM] = 2;
|
||||||
can_move[t][PT_STKM2] = 2;
|
can_move[t][PT_STKM2] = 2;
|
||||||
|
can_move[PT_FIGH][t] = 2;
|
||||||
//INVIS behaviour varies with pressure
|
//INVIS behaviour varies with pressure
|
||||||
can_move[t][PT_INVIS] = 3;
|
can_move[t][PT_INVIS] = 3;
|
||||||
//stop CNCT being displaced by other particles
|
//stop CNCT being displaced by other particles
|
||||||
@ -310,6 +315,11 @@ int try_move(int i, int x, int y, int nx, int ny)
|
|||||||
{
|
{
|
||||||
player2[27] = 0;
|
player2[27] = 0;
|
||||||
}
|
}
|
||||||
|
if (parts[i].type == PT_FIGH)
|
||||||
|
{
|
||||||
|
fighters[(unsigned char)parts[i].tmp][27] = 0;
|
||||||
|
fighcount--;
|
||||||
|
}
|
||||||
parts[i].type=PT_NONE;
|
parts[i].type=PT_NONE;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -323,6 +333,11 @@ int try_move(int i, int x, int y, int nx, int ny)
|
|||||||
{
|
{
|
||||||
player2[27] = 0;
|
player2[27] = 0;
|
||||||
}
|
}
|
||||||
|
if (parts[i].type == PT_FIGH)
|
||||||
|
{
|
||||||
|
fighters[(unsigned char)parts[i].tmp][27] = 0;
|
||||||
|
fighcount--;
|
||||||
|
}
|
||||||
parts[i].type=PT_NONE;
|
parts[i].type=PT_NONE;
|
||||||
if (!legacy_enable)
|
if (!legacy_enable)
|
||||||
{
|
{
|
||||||
@ -592,6 +607,11 @@ void kill_part(int i)//kills particle number i
|
|||||||
{
|
{
|
||||||
player2[27] = 0;
|
player2[27] = 0;
|
||||||
}
|
}
|
||||||
|
if (parts[i].type == PT_FIGH)
|
||||||
|
{
|
||||||
|
fighters[(unsigned char)parts[i].tmp][27] = 0;
|
||||||
|
fighcount--;
|
||||||
|
}
|
||||||
if (parts[i].type == PT_SPAWN)
|
if (parts[i].type == PT_SPAWN)
|
||||||
{
|
{
|
||||||
ISSPAWN1 = 0;
|
ISSPAWN1 = 0;
|
||||||
@ -633,6 +653,12 @@ inline void part_change_type(int i, int x, int y, int t)//changes the type of pa
|
|||||||
if (parts[i].type == PT_STKM2)
|
if (parts[i].type == PT_STKM2)
|
||||||
player2[27] = 0;
|
player2[27] = 0;
|
||||||
|
|
||||||
|
if (parts[i].type == PT_FIGH)
|
||||||
|
{
|
||||||
|
fighters[(unsigned char)parts[i].tmp][27] = 0;
|
||||||
|
fighcount--;
|
||||||
|
}
|
||||||
|
|
||||||
parts[i].type = t;
|
parts[i].type = t;
|
||||||
if (t==PT_PHOT || t==PT_NEUT)
|
if (t==PT_PHOT || t==PT_NEUT)
|
||||||
{
|
{
|
||||||
@ -761,7 +787,7 @@ inline int create_part(int p, int x, int y, int tv)//the function for creating a
|
|||||||
{
|
{
|
||||||
if ((pmap[y][x]&0xFF)!=PT_SPAWN&&(pmap[y][x]&0xFF)!=PT_SPAWN2)
|
if ((pmap[y][x]&0xFF)!=PT_SPAWN&&(pmap[y][x]&0xFF)!=PT_SPAWN2)
|
||||||
{
|
{
|
||||||
if (t!=PT_STKM&&t!=PT_STKM2)
|
if (t!=PT_STKM&&t!=PT_STKM2&&t!=PT_FIGH)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -787,7 +813,7 @@ inline int create_part(int p, int x, int y, int tv)//the function for creating a
|
|||||||
t!=PT_CLNE&&t!=PT_PCLN&&
|
t!=PT_CLNE&&t!=PT_PCLN&&
|
||||||
t!=PT_BCLN&&t!=PT_STKM&&
|
t!=PT_BCLN&&t!=PT_STKM&&
|
||||||
t!=PT_STKM2&&t!=PT_PBCN&&
|
t!=PT_STKM2&&t!=PT_PBCN&&
|
||||||
t!=PT_STOR)
|
t!=PT_STOR&&t!=PT_FIGH)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
parts[pmap[y][x]>>8].ctype = t;
|
parts[pmap[y][x]>>8].ctype = t;
|
||||||
@ -836,7 +862,7 @@ inline int create_part(int p, int x, int y, int tv)//the function for creating a
|
|||||||
parts[i].pavg[0] = 0.0f;
|
parts[i].pavg[0] = 0.0f;
|
||||||
parts[i].pavg[1] = 0.0f;
|
parts[i].pavg[1] = 0.0f;
|
||||||
}
|
}
|
||||||
if (t!=PT_STKM&&t!=PT_STKM2)//set everything to default values first, except for stickman.
|
if (t!=PT_STKM&&t!=PT_STKM2&&t!=PT_FIGH)//set everything to default values first, except for stickman.
|
||||||
{
|
{
|
||||||
parts[i].x = (float)x;
|
parts[i].x = (float)x;
|
||||||
parts[i].y = (float)y;
|
parts[i].y = (float)y;
|
||||||
@ -1003,12 +1029,36 @@ inline int create_part(int p, int x, int y, int tv)//the function for creating a
|
|||||||
create_part(-1,x,y,PT_SPAWN2);
|
create_part(-1,x,y,PT_SPAWN2);
|
||||||
ISSPAWN2 = 1;
|
ISSPAWN2 = 1;
|
||||||
}
|
}
|
||||||
|
if (t==PT_FIGH)
|
||||||
|
{
|
||||||
|
unsigned char cunt = 0;
|
||||||
|
while (cunt < 100 && cunt < (fighcount+1) && fighters[cunt][27]==1) cunt++;
|
||||||
|
if (cunt < 100 && fighters[cunt][27]==0)
|
||||||
|
{
|
||||||
|
parts[i].x = (float)x;
|
||||||
|
parts[i].y = (float)y;
|
||||||
|
parts[i].type = PT_FIGH;
|
||||||
|
parts[i].vx = 0;
|
||||||
|
parts[i].vy = 0;
|
||||||
|
parts[i].life = 100;
|
||||||
|
parts[i].ctype = 0;
|
||||||
|
parts[i].tmp = cunt;
|
||||||
|
parts[i].temp = ptypes[t].heat;
|
||||||
|
STKM_init_legs(fighters[cunt], i);
|
||||||
|
fighters[cunt][27] = 1;
|
||||||
|
fighters[cunt][2] = PT_DUST;
|
||||||
|
fighcount++;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (t==PT_BIZR||t==PT_BIZRG)
|
if (t==PT_BIZR||t==PT_BIZRG)
|
||||||
parts[i].ctype = 0x47FFFF;
|
parts[i].ctype = 0x47FFFF;
|
||||||
//and finally set the pmap/photon maps to the newly created particle
|
//and finally set the pmap/photon maps to the newly created particle
|
||||||
if (t==PT_PHOT||t==PT_NEUT)
|
if (t==PT_PHOT||t==PT_NEUT)
|
||||||
photons[y][x] = t|(i<<8);
|
photons[y][x] = t|(i<<8);
|
||||||
if (t!=PT_STKM&&t!=PT_STKM2 && t!=PT_PHOT && t!=PT_NEUT)
|
if (t!=PT_STKM&&t!=PT_STKM2 && t!=PT_FIGH && t!=PT_PHOT && t!=PT_NEUT)
|
||||||
pmap[y][x] = t|(i<<8);
|
pmap[y][x] = t|(i<<8);
|
||||||
|
|
||||||
//Fancy dust effects for powder types
|
//Fancy dust effects for powder types
|
||||||
@ -1674,7 +1724,7 @@ void update_particles_i(pixel *vid, int start, int inc)
|
|||||||
(bmap[y/CELL][x/CELL]==WL_ALLOWGAS && !(ptypes[t].properties&TYPE_GAS)) || //&& ptypes[t].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE && parts[i].type!=PT_HFLM) ||
|
(bmap[y/CELL][x/CELL]==WL_ALLOWGAS && !(ptypes[t].properties&TYPE_GAS)) || //&& ptypes[t].falldown!=0 && parts[i].type!=PT_FIRE && parts[i].type!=PT_SMKE && parts[i].type!=PT_HFLM) ||
|
||||||
(bmap[y/CELL][x/CELL]==WL_ALLOWENERGY && !(ptypes[t].properties&TYPE_ENERGY)) ||
|
(bmap[y/CELL][x/CELL]==WL_ALLOWENERGY && !(ptypes[t].properties&TYPE_ENERGY)) ||
|
||||||
(bmap[y/CELL][x/CELL]==WL_DETECT && (t==PT_METL || t==PT_SPRK)) ||
|
(bmap[y/CELL][x/CELL]==WL_DETECT && (t==PT_METL || t==PT_SPRK)) ||
|
||||||
(bmap[y/CELL][x/CELL]==WL_EWALL && !emap[y/CELL][x/CELL])) && (t!=PT_STKM) && (t!=PT_STKM2)))
|
(bmap[y/CELL][x/CELL]==WL_EWALL && !emap[y/CELL][x/CELL])) && (t!=PT_STKM) && (t!=PT_STKM2) && (t!=PT_FIGH)))
|
||||||
{
|
{
|
||||||
kill_part(i);
|
kill_part(i);
|
||||||
continue;
|
continue;
|
||||||
@ -1736,7 +1786,7 @@ void update_particles_i(pixel *vid, int start, int inc)
|
|||||||
pGravX -= gravxf[(y*XRES)+x];
|
pGravX -= gravxf[(y*XRES)+x];
|
||||||
pGravY -= gravyf[(y*XRES)+x];
|
pGravY -= gravyf[(y*XRES)+x];
|
||||||
}
|
}
|
||||||
else if(t!=PT_STKM && t!=PT_STKM2 && !(ptypes[t].properties & TYPE_SOLID))
|
else if(t!=PT_STKM && t!=PT_STKM2 && t!=PT_FIGH && !(ptypes[t].properties & TYPE_SOLID))
|
||||||
{
|
{
|
||||||
pGravX += gravxf[(y*XRES)+x];
|
pGravX += gravxf[(y*XRES)+x];
|
||||||
pGravY += gravyf[(y*XRES)+x];
|
pGravY += gravyf[(y*XRES)+x];
|
||||||
@ -2838,7 +2888,7 @@ int create_parts(int x, int y, int rx, int ry, int c, int flags)
|
|||||||
int i, j, r, f = 0, u, v, oy, ox, b = 0, dw = 0, stemp = 0, p;//n;
|
int i, j, r, f = 0, u, v, oy, ox, b = 0, dw = 0, stemp = 0, p;//n;
|
||||||
|
|
||||||
int wall = c - 100;
|
int wall = c - 100;
|
||||||
if (c==SPC_WIND){
|
if (c==SPC_WIND || c==PT_FIGH)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(c==SPC_PROP){
|
if(c==SPC_PROP){
|
||||||
|
Loading…
Reference in New Issue
Block a user