kolibrios-fun/contrib/games/opentyrian/src/starlib.c
turbocat a27452493c OpenTyrian: Sources uploaded
git-svn-id: svn://kolibrios.org@9169 a494cfbc-eb01-0410-851d-a64ba20cac60
2021-08-31 18:22:39 +00:00

432 lines
8.5 KiB
C

/*
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "starlib.h"
#include "keyboard.h"
#include "mtrand.h"
#include "opentyr.h"
#include "video.h"
#include <ctype.h>
#define starlib_MAX_STARS 1000
#define MAX_TYPES 14
struct JE_StarType
{
JE_integer spX, spY, spZ;
JE_integer lastX, lastY;
};
static int tempX, tempY;
static JE_boolean run;
static struct JE_StarType star[starlib_MAX_STARS];
static JE_byte setup;
static JE_word stepCounter;
static JE_word nsp2;
static JE_shortint nspVar2Inc;
/* JE: new sprite pointer */
static JE_real nsp;
static JE_real nspVarInc;
static JE_real nspVarVarInc;
static JE_word changeTime;
static JE_boolean doChange;
static JE_boolean grayB;
static JE_integer starlib_speed;
static JE_shortint speedChange;
static JE_byte pColor;
void JE_starlib_main( void )
{
int off;
JE_word i;
JE_integer tempZ;
JE_byte tempCol;
struct JE_StarType *stars;
Uint8 *surf;
JE_wackyCol();
grayB = false;
starlib_speed += speedChange;
for(stars = star, i = starlib_MAX_STARS; i > 0; stars++, i--)
{
/* Make a pointer to the screen... */
surf = VGAScreen->pixels;
/* Calculate the offset to where we wish to draw */
off = (stars->lastX)+(stars->lastY)*320;
/* We don't want trails in our star field. Erase the old graphic */
if (off >= 640 && off < (320*200)-640)
{
surf[off] = 0; /* Shade Level 0 */
surf[off-1] = 0; /* Shade Level 1, 2 */
surf[off+1] = 0;
surf[off-2] = 0;
surf[off+2] = 0;
surf[off-320] = 0;
surf[off+320] = 0;
surf[off-640] = 0;
surf[off+640] = 0;
}
/* Move star */
tempZ = stars->spZ;
tempX = (stars->spX / tempZ) + 160;
tempY = (stars->spY / tempZ) + 100;
tempZ -= starlib_speed;
/* If star is out of range, make a new one */
if (tempZ <= 0 ||
tempY == 0 || tempY > 198 ||
tempX > 318 || tempX < 1)
{
stars->spZ = 500;
JE_newStar();
stars->spX = tempX;
stars->spY = tempY;
}
else /* Otherwise, update & draw it */
{
stars->lastX = tempX;
stars->lastY = tempY;
stars->spZ = tempZ;
off = tempX+tempY*320;
if (grayB)
{
tempCol = tempZ >> 1;
} else {
tempCol = pColor+((tempZ >> 4) & 31);
}
/* Draw the pixel! */
if (off >= 640 && off < (320*200)-640)
{
surf[off] = tempCol;
tempCol += 72;
surf[off-1] = tempCol;
surf[off+1] = tempCol;
surf[off-320] = tempCol;
surf[off+320] = tempCol;
tempCol += 72;
surf[off-2] = tempCol;
surf[off+2] = tempCol;
surf[off-640] = tempCol;
surf[off+640] = tempCol;
}
}
}
if (newkey)
{
switch (toupper(lastkey_char))
{
case '+':
starlib_speed++;
speedChange = 0;
break;
case '-':
starlib_speed--;
speedChange = 0;
break;
case '1':
JE_changeSetup(1);
break;
case '2':
JE_changeSetup(2);
break;
case '3':
JE_changeSetup(3);
break;
case '4':
JE_changeSetup(4);
break;
case '5':
JE_changeSetup(5);
break;
case '6':
JE_changeSetup(6);
break;
case '7':
JE_changeSetup(7);
break;
case '8':
JE_changeSetup(8);
break;
case '9':
JE_changeSetup(9);
break;
case '0':
JE_changeSetup(10);
break;
case '!':
JE_changeSetup(11);
break;
case '@':
JE_changeSetup(12);
break;
case '#':
JE_changeSetup(13);
break;
case '$':
JE_changeSetup(14);
break;
case 'C':
JE_resetValues();
break;
case 'S':
nspVarVarInc = mt_rand_1() * 0.01f - 0.005f;
break;
case 'X':
case 27:
run = false;
break;
case '[':
pColor--;
break;
case ']':
pColor++;
break;
case '{':
pColor -= 72;
break;
case '}':
pColor += 72;
break;
case '`': /* ` */
doChange = !doChange;
break;
case 'P':
wait_noinput(true, false, false);
wait_input(true, false, false);
break;
default:
break;
}
}
if (doChange)
{
stepCounter++;
if (stepCounter > changeTime)
{
JE_changeSetup(0);
}
}
if ((mt_rand() % 1000) == 1)
{
nspVarVarInc = mt_rand_1() * 0.01f - 0.005f;
}
nspVarInc += nspVarVarInc;
}
void JE_wackyCol( void )
{
/* YKS: Does nothing */
}
void JE_starlib_init( void )
{
static JE_boolean initialized = false;
if (!initialized)
{
initialized = true;
JE_resetValues();
JE_changeSetup(2);
doChange = true;
/* RANDOMIZE; */
for (int x = 0; x < starlib_MAX_STARS; x++)
{
star[x].spX = (mt_rand() % 64000) - 32000;
star[x].spY = (mt_rand() % 40000) - 20000;
star[x].spZ = x+1;
}
}
}
void JE_resetValues( void )
{
nsp2 = 1;
nspVar2Inc = 1;
nspVarInc = 0.1f;
nspVarVarInc = 0.0001f;
nsp = 0;
pColor = 32;
starlib_speed = 2;
speedChange = 0;
}
void JE_changeSetup( JE_byte setupType )
{
stepCounter = 0;
changeTime = (mt_rand() % 1000);
if (setupType > 0)
{
setup = setupType;
} else {
setup = mt_rand() % (MAX_TYPES + 1);
}
if (setup == 1)
{
nspVarInc = 0.1f;
}
if (nspVarInc > 2.2f)
{
nspVarInc = 0.1f;
}
}
void JE_newStar( void )
{
if (setup == 0)
{
tempX = (mt_rand() % 64000) - 32000;
tempY = (mt_rand() % 40000) - 20000;
} else {
nsp = nsp + nspVarInc; /* YKS: < lol */
switch (setup)
{
case 1:
tempX = (int)(sinf(nsp / 30) * 20000);
tempY = (mt_rand() % 40000) - 20000;
break;
case 2:
tempX = (int)(cosf(nsp) * 20000);
tempY = (int)(sinf(nsp) * 20000);
break;
case 3:
tempX = (int)(cosf(nsp * 15) * 100) * ((int)(nsp / 6) % 200);
tempY = (int)(sinf(nsp * 15) * 100) * ((int)(nsp / 6) % 200);
break;
case 4:
tempX = (int)(sinf(nsp / 60) * 20000);
tempY = (int)(cosf(nsp) * (int)(sinf(nsp / 200) * 300) * 100);
break;
case 5:
tempX = (int)(sinf(nsp / 2) * 20000);
tempY = (int)(cosf(nsp) * (int)(sinf(nsp / 200) * 300) * 100);
break;
case 6:
tempX = (int)(sinf(nsp) * 40000);
tempY = (int)(cosf(nsp) * 20000);
break;
case 8:
tempX = (int)(sinf(nsp / 2) * 40000);
tempY = (int)(cosf(nsp) * 20000);
break;
case 7:
tempX = mt_rand() % 65535;
if ((mt_rand() % 2) == 0)
{
tempY = (int)(cosf(nsp / 80) * 10000) + 15000;
} else {
tempY = 50000 - (int)(cosf(nsp / 80) * 13000);
}
break;
case 9:
nsp2 += nspVar2Inc;
if ((nsp2 == 65535) || (nsp2 == 0))
{
nspVar2Inc = -nspVar2Inc;
}
tempX = (int)(cosf(sinf(nsp2 / 10.0f) + (nsp / 500)) * 32000);
tempY = (int)(sinf(cosf(nsp2 / 10.0f) + (nsp / 500)) * 30000);
break;
case 10:
nsp2 += nspVar2Inc;
if ((nsp2 == 65535) || (nsp2 == 0))
{
nspVar2Inc = -nspVar2Inc;
}
tempX = (int)(cosf(sinf(nsp2 / 5.0f) + (nsp / 100)) * 32000);
tempY = (int)(sinf(cosf(nsp2 / 5.0f) + (nsp / 100)) * 30000);
break;;
case 11:
nsp2 += nspVar2Inc;
if ((nsp2 == 65535) || (nsp2 == 0))
{
nspVar2Inc = -nspVar2Inc;
}
tempX = (int)(cosf(sinf(nsp2 / 1000.0f) + (nsp / 2)) * 32000);
tempY = (int)(sinf(cosf(nsp2 / 1000.0f) + (nsp / 2)) * 30000);
break;
case 12:
if (nsp != 0)
{
nsp2 += nspVar2Inc;
if ((nsp2 == 65535) || (nsp2 == 0))
{
nspVar2Inc = -nspVar2Inc;
}
tempX = (int)(cosf(sinf(nsp2 / 2.0f) / (sqrtf(fabsf(nsp)) / 10.0f + 1) + (nsp2 / 100.0f)) * 32000);
tempY = (int)(sinf(cosf(nsp2 / 2.0f) / (sqrtf(fabsf(nsp)) / 10.0f + 1) + (nsp2 / 100.0f)) * 30000);
}
break;
case 13:
if (nsp != 0)
{
nsp2 += nspVar2Inc;
if ((nsp2 == 65535) || (nsp2 == 0))
{
nspVar2Inc = -nspVar2Inc;
}
tempX = (int)(cosf(sinf(nsp2 / 10.0f) / 2 + (nsp / 20)) * 32000);
tempY = (int)(sinf(sinf(nsp2 / 11.0f) / 2 + (nsp / 20)) * 30000);
}
break;
case 14:
nsp2 += nspVar2Inc;
tempX = (int)((sinf(nsp) + cosf(nsp2 / 1000.0f) * 3) * 12000);
tempY = (int)(cosf(nsp) * 10000) + nsp2;
break;
}
}
}