385 lines
14 KiB
C
385 lines
14 KiB
C
/***************************************************************************
|
|
* Pachi el marciano *
|
|
* ----------------- *
|
|
* (c) Santiago Radeff (coding) *
|
|
* (c) Nicolas Radeff (graphics) *
|
|
* (c) Peter Hajba (music) *
|
|
* *
|
|
* T-1000@Bigfoot.com *
|
|
****************************************************************************
|
|
*******************************************************************
|
|
* *
|
|
* 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. *
|
|
* *
|
|
*******************************************************************/
|
|
|
|
void loose_life()
|
|
{
|
|
Mix_Volume(4,100);
|
|
Mix_PlayChannel(4,die,0);
|
|
blinkscreen(255,0,0,0);
|
|
mplayer[dificulty].x=mplayer[dificulty].start_x;
|
|
mplayer[dificulty].y=mplayer[dificulty].start_y;
|
|
mplayer[dificulty].h=mplayer[dificulty].h;
|
|
mplayer[dificulty].left=0;
|
|
mplayer[dificulty].right=0;
|
|
mplayer[dificulty].jump=0;
|
|
mplayer[dificulty].duck=0;
|
|
mplayer[dificulty].lives--;
|
|
mplayer[dificulty].jumpcounter=0;
|
|
mplayer[dificulty].dead=0;
|
|
if(mplayer[dificulty].lives>0)
|
|
{
|
|
blinkscreen(255,255,255,0);
|
|
load_room();
|
|
print_room();
|
|
init_monsters();
|
|
}
|
|
}
|
|
|
|
void pick_obj(int x, int y) // esta rutina elimina el objeto de la matriz objects, lo elimina de la pantalla y le suma la puntuacion conrrespondiente al jugador
|
|
{
|
|
initfade_object(x, y, mroom.data[x][y]);
|
|
fadingobject=1;
|
|
mroom.data[x][y]=0;
|
|
for(int n=0;n<5;n++)
|
|
{
|
|
if((mobject[(R_current-1)*5+n].x == x) && (mobject[(R_current-1)*5+n].y == y))
|
|
{
|
|
score = score + (50*dificulty);
|
|
if(sequence==mobject[(R_current-1)*5+n].seq)
|
|
{
|
|
gametimer=gametimer+5;
|
|
Mix_Volume(6,128);
|
|
Mix_PlayChannel(6,objseq,0);
|
|
}
|
|
mobject[(R_current-1)*5+n].type = 0;
|
|
mobject[(R_current-1)*5+n].x = 0;
|
|
mobject[(R_current-1)*5+n].y = 0;
|
|
mobject[(R_current-1)*5+n].seq = 0;
|
|
print_monitor();
|
|
}
|
|
}
|
|
|
|
mplayer[dificulty].objects++;
|
|
Mix_Volume(1,100);
|
|
if(mplayer[dificulty].objects==mstage[stage-1].objects)
|
|
{
|
|
stagecompleted = 1;
|
|
blinkscreen(255,255,255,0);
|
|
Mix_PlayChannel(1,stageready,0);
|
|
}
|
|
else
|
|
Mix_PlayChannel(1,obj,0);
|
|
print_room();
|
|
}
|
|
|
|
void chk_touched(int x, int y)
|
|
{
|
|
if((mroom.data[x][y] >= 239) && (stagecompleted == 1))
|
|
{
|
|
Mix_HaltMusic();
|
|
Mix_Volume(0,100);
|
|
Mix_PlayChannel(0,exitlevel,0);
|
|
mplayer[dificulty].stageup=1;
|
|
}
|
|
if((mroom.data[x][y] >= 220) && (mroom.data[x][y] < 239))
|
|
mplayer[dificulty].dead=1;
|
|
if((mroom.data[x][y] < 220) && (mroom.data[x][y] >= 200))
|
|
pick_obj(x,y);
|
|
}
|
|
|
|
void P_chk_right()
|
|
{
|
|
int x, y;
|
|
if(mplayer[dificulty].x + mplayer[dificulty].w >= (R_tileside*R_maxtiles_h))
|
|
{
|
|
R_current++;
|
|
mplayer[dificulty].x = 2;
|
|
mplayer[dificulty].start_x = int(mplayer[dificulty].x);
|
|
mplayer[dificulty].start_y = int(mplayer[dificulty].y);
|
|
if(mplayer[dificulty].duck==1)
|
|
mplayer[dificulty].start_y=mplayer[dificulty].start_y-(P_h - P_h/2); // P_h es la altura parado y P_h/2 la altura agachado
|
|
init_room();
|
|
}
|
|
|
|
for(int n=0;n<=mplayer[dificulty].h-mplayer[dificulty].tolerance;n++)
|
|
{
|
|
x=int(mplayer[dificulty].x+mplayer[dificulty].w)/R_tileside;
|
|
y=int((mplayer[dificulty].y+n)/R_tileside);
|
|
chk_touched(x, y);
|
|
|
|
if(mroom.data[x][y] >= 80 && mroom.data[x][y] < 200)
|
|
mplayer[dificulty].x=mplayer[dificulty].old_x;
|
|
}
|
|
}
|
|
|
|
void P_chk_left()
|
|
{
|
|
int x, y;
|
|
if(mplayer[dificulty].x < 2)
|
|
{
|
|
R_current--;
|
|
init_room();
|
|
mplayer[dificulty].x = R_maxtiles_h*R_tileside - mplayer[dificulty].w;
|
|
mplayer[dificulty].start_x = int(mplayer[dificulty].x); //estas variables son para cuando se pierde una vida se vuelve el player a esta posicion
|
|
mplayer[dificulty].start_y = int(mplayer[dificulty].y);
|
|
if(mplayer[dificulty].duck==1)
|
|
mplayer[dificulty].start_y=mplayer[dificulty].start_y-(P_h - P_h/2);
|
|
}
|
|
|
|
for(int n=0;n<=mplayer[dificulty].h-mplayer[dificulty].tolerance;n++)
|
|
{
|
|
x=int(mplayer[dificulty].x)/R_tileside; //posible P_x -1
|
|
y=int((mplayer[dificulty].y+1+n)/R_tileside);
|
|
chk_touched(x,y);
|
|
|
|
if(mroom.data[x][y] >= 80 && mroom.data[x][y] < 200)
|
|
mplayer[dificulty].x=mplayer[dificulty].old_x;
|
|
}
|
|
}
|
|
|
|
void chk_up()
|
|
{
|
|
int x, y;
|
|
if(mplayer[dificulty].y <= 1)
|
|
{
|
|
R_current = R_current - R_max_x;
|
|
mplayer[dificulty].y = float(((R_maxtiles_v-1)*R_tileside) - mplayer[dificulty].h - 1);
|
|
mplayer[dificulty].start_x = int(mplayer[dificulty].x); //estas variables son para cuando se pierde una vida se vuelve el player a esta posicion
|
|
mplayer[dificulty].start_y = int(mplayer[dificulty].y);
|
|
mplayer[dificulty].startjump=int(mplayer[dificulty].y+(R_tileside*1.5));
|
|
init_room();
|
|
}
|
|
for(int n=0;n<=mplayer[dificulty].w-1;n++)
|
|
{
|
|
x=int(mplayer[dificulty].x+n)/R_tileside;
|
|
y=int(mplayer[dificulty].y/R_tileside);
|
|
chk_touched(x,y); //esta rutina compruba que tipo de tile toca el personaje
|
|
|
|
if(mroom.data[x][y] >= 80 && mroom.data[x][y] < 200)
|
|
{
|
|
mplayer[dificulty].y=int((y+1)*R_tileside);
|
|
if(mplayer[dificulty].jump == 1 && mplayer[dificulty].upflag == 1)
|
|
{
|
|
mplayer[dificulty].upflag = 0;
|
|
mplayer[dificulty].downflag = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void chk_down()
|
|
{
|
|
int x, y;
|
|
if((mplayer[dificulty].jump==0) || (mplayer[dificulty].downflag==1))
|
|
{
|
|
for(int n=0;n<mplayer[dificulty].w ;n++)
|
|
{
|
|
x=int(mplayer[dificulty].x+n)/R_tileside;
|
|
y=int((mplayer[dificulty].y+mplayer[dificulty].h+1)/R_tileside);
|
|
chk_touched(x,y);
|
|
|
|
if(mroom.data[x][y] >= 40 && mroom.data[x][y] < 200)
|
|
{
|
|
mplayer[dificulty].y=mplayer[dificulty].old_y;
|
|
mplayer[dificulty].infloor=1; // esta varible indica si esta en el suelo
|
|
mplayer[dificulty].y=int((mplayer[dificulty].y+(R_tileside/2))/R_tileside)*R_tileside;
|
|
mplayer[dificulty].jump=0;
|
|
mplayer[dificulty].jumpcounter=0;
|
|
mplayer[dificulty].upflag=0;
|
|
mplayer[dificulty].downflag=1;
|
|
}
|
|
}
|
|
if(mplayer[dificulty].y >= (R_maxtiles_v*R_tileside) - mplayer[dificulty].h)
|
|
{
|
|
R_current = R_current + R_max_x;
|
|
init_room();
|
|
mplayer[dificulty].y = 2;
|
|
mplayer[dificulty].start_x = int(mplayer[dificulty].x); //estas variables son para cuando se pierde una vida se vuelve el player a esta posicion
|
|
mplayer[dificulty].start_y = int(mplayer[dificulty].y);
|
|
}
|
|
}
|
|
}
|
|
|
|
void chk_colmonsters() //chequear colisiones contra monstruos
|
|
{
|
|
for(int n=0;n<=M_max4room-1;n++)
|
|
{
|
|
if(M_type[n] != 0)
|
|
if(mplayer[dificulty].y < M_y[n]+M_h-mplayer[dificulty].tolerance && mplayer[dificulty].y+mplayer[dificulty].h > M_y[n]+mplayer[dificulty].tolerance)
|
|
if(mplayer[dificulty].x < M_x[n]+M_h-mplayer[dificulty].tolerance && mplayer[dificulty].x+mplayer[dificulty].w > M_x[n]+mplayer[dificulty].tolerance)
|
|
mplayer[dificulty].dead=1;
|
|
}
|
|
}
|
|
|
|
void set_player_pos()
|
|
{
|
|
if(mplayer[dificulty].dead==0) // si el personaje esta muerto no chequea colisiones
|
|
{
|
|
mplayer[dificulty].infloor = 0;
|
|
mplayer[dificulty].old_x = mplayer[dificulty].x;
|
|
mplayer[dificulty].old_y = mplayer[dificulty].y;
|
|
|
|
chk_colmonsters(); // esta rutina chequea colisiones contra monstruos
|
|
|
|
if(mplayer[dificulty].duck == 1)
|
|
mplayer[dificulty].h=P_h/2;
|
|
else
|
|
mplayer[dificulty].h=P_h;
|
|
|
|
|
|
if(mplayer[dificulty].left==1)
|
|
{
|
|
if(mplayer[dificulty].duck==1)
|
|
mplayer[dificulty].speed=mplayer[dificulty].realspeed/2;
|
|
else
|
|
mplayer[dificulty].speed=mplayer[dificulty].realspeed;
|
|
|
|
mplayer[dificulty].x=mplayer[dificulty].x-(mplayer[dificulty].speed*imove);
|
|
|
|
P_chk_left();
|
|
}
|
|
if(mplayer[dificulty].right==1)
|
|
{
|
|
if(mplayer[dificulty].duck==1)
|
|
mplayer[dificulty].speed=mplayer[dificulty].realspeed/2;
|
|
else
|
|
mplayer[dificulty].speed=mplayer[dificulty].realspeed;
|
|
|
|
mplayer[dificulty].x=mplayer[dificulty].x+(mplayer[dificulty].speed*imove);
|
|
|
|
P_chk_right();
|
|
}
|
|
if(mplayer[dificulty].jump==1)
|
|
{
|
|
if(mplayer[dificulty].upflag==1)
|
|
{
|
|
mplayer[dificulty].jumpcounter=int(mplayer[dificulty].startjump-mplayer[dificulty].y);
|
|
|
|
mplayer[dificulty].maxjump=mplayer[dificulty].realmaxjump;
|
|
|
|
if(mplayer[dificulty].jumpcounter <= mplayer[dificulty].maxjump)
|
|
{
|
|
if(mplayer[dificulty].jumpcounter >= mplayer[dificulty].maxjump/1.5)
|
|
{
|
|
if(mplayer[dificulty].jumpslower==1)
|
|
{
|
|
mplayer[dificulty].y=mplayer[dificulty].y+(mplayer[dificulty].fallspeed*imove);
|
|
mplayer[dificulty].jumpslower=0;
|
|
}
|
|
else
|
|
mplayer[dificulty].jumpslower=1;
|
|
}
|
|
mplayer[dificulty].y=mplayer[dificulty].y-(mplayer[dificulty].fallspeed*imove);
|
|
}
|
|
else
|
|
{
|
|
mplayer[dificulty].downflag = 1;
|
|
mplayer[dificulty].upflag = 0;
|
|
}
|
|
chk_up();
|
|
}
|
|
if(mplayer[dificulty].downflag==1)
|
|
{
|
|
mplayer[dificulty].jumpcounter=int(mplayer[dificulty].y-mplayer[dificulty].startjump);
|
|
if(mplayer[dificulty].jumpcounter > 0)
|
|
{
|
|
|
|
mplayer[dificulty].maxjump=mplayer[dificulty].realmaxjump;
|
|
|
|
if(mplayer[dificulty].jumpcounter >= mplayer[dificulty].maxjump/1.5)
|
|
{
|
|
if(mplayer[dificulty].jumpslower==1)
|
|
{
|
|
mplayer[dificulty].y=mplayer[dificulty].y-(mplayer[dificulty].fallspeed*imove);
|
|
mplayer[dificulty].jumpslower=0;
|
|
}
|
|
else
|
|
mplayer[dificulty].jumpslower=1;
|
|
}
|
|
mplayer[dificulty].y=mplayer[dificulty].y+(mplayer[dificulty].fallspeed*imove);
|
|
}
|
|
else
|
|
{
|
|
mplayer[dificulty].jump = 0;
|
|
}
|
|
}
|
|
}
|
|
if(mplayer[dificulty].jump==0)
|
|
mplayer[dificulty].y=mplayer[dificulty].y+(mplayer[dificulty].fallspeed*imove); // para que se caiga si no hay suelo debajo
|
|
chk_down();
|
|
}
|
|
oldplayerpos.x = int(mplayer[dificulty].old_x);
|
|
oldplayerpos.y = int(mplayer[dificulty].old_y);
|
|
oldplayerpos.w = mplayer[dificulty].w;
|
|
oldplayerpos.h = mplayer[dificulty].h;
|
|
if(mplayer[dificulty].ducked==1)
|
|
{
|
|
mplayer[dificulty].ducked = 0;
|
|
oldplayerpos.h = oldplayerpos.h + (P_h - P_h/2);
|
|
oldplayerpos.y = oldplayerpos.y - (P_h - P_h/2);
|
|
}
|
|
playerpos.x = int(mplayer[dificulty].x);
|
|
playerpos.y = int(mplayer[dificulty].y);
|
|
}
|
|
|
|
void clean_player()
|
|
{
|
|
set_player_pos();
|
|
playerposreal.x = playerpos.x + R_gamearea_x;
|
|
playerposreal.y = playerpos.y + R_gamearea_y;
|
|
oldplayerposreal.x = oldplayerpos.x + R_gamearea_x;
|
|
oldplayerposreal.y = oldplayerpos.y + R_gamearea_y;
|
|
|
|
//SDL_BlitSurface(screenbak,&oldplayerpos,screen, &oldplayerposreal);
|
|
}
|
|
void print_player()
|
|
{
|
|
playersrc.y = mplayer[dificulty].framer*P_h;
|
|
playersrc.x = mplayer[dificulty].w * (mplayer[dificulty].frame - 1 + mplayer[dificulty].facingleft*mplayer[dificulty].frames);
|
|
playersrc.w = mplayer[dificulty].w;
|
|
playersrc.h = mplayer[dificulty].h;
|
|
|
|
SDL_BlitSurface(player, &playersrc, screen, &playerposreal);
|
|
//SDL_UpdateRect(screen,oldplayerposreal.x,oldplayerposreal.y,P_w,oldplayerpos.h);
|
|
//SDL_UpdateRect(screen,playerposreal.x,playerposreal.y,mplayer[dificulty].w,mplayer[dificulty].h);
|
|
}
|
|
|
|
void animateplayer()
|
|
{
|
|
// Esta rutina pone el valor correspondiente a la fila de sprites en el archivo BMP del personaje en la variable framer
|
|
|
|
if(mplayer[dificulty].right!=0 || mplayer[dificulty].left != 0)
|
|
{
|
|
mplayer[dificulty].frame++;
|
|
if(mplayer[dificulty].duck==1 && mplayer[dificulty].right==0 && mplayer[dificulty].left==0)
|
|
mplayer[dificulty].frame--;
|
|
}
|
|
|
|
if(mplayer[dificulty].right==1 || mplayer[dificulty].left == 1)
|
|
mplayer[dificulty].framer = 1;
|
|
if(mplayer[dificulty].right==0 && mplayer[dificulty].left == 0 && mplayer[dificulty].duck==0) // parado
|
|
{
|
|
mplayer[dificulty].framer = 0;
|
|
mplayer[dificulty].frame++;
|
|
}
|
|
if(mplayer[dificulty].duck==1) // agachado
|
|
mplayer[dificulty].framer = 2;
|
|
if(mplayer[dificulty].jump==1 && mplayer[dificulty].upflag==1) // saltando (subiendo)
|
|
{
|
|
mplayer[dificulty].framer = 3;
|
|
mplayer[dificulty].frame = 1;
|
|
}
|
|
if(mplayer[dificulty].downflag==1 && mplayer[dificulty].infloor == 0 && mplayer[dificulty].duck== 0) // cayendo o saltando (bajando)
|
|
{
|
|
mplayer[dificulty].framer = 3;
|
|
mplayer[dificulty].frame = 2;
|
|
}
|
|
if(mplayer[dificulty].frame > mplayer[dificulty].frames)
|
|
mplayer[dificulty].frame=1;
|
|
}
|