871 lines
24 KiB
C
871 lines
24 KiB
C
#include <gint/display.h>
|
|
#include <gint/keyboard.h>
|
|
#include <gint/std/string.h>
|
|
#include "level.h"
|
|
#include "engine.h"
|
|
extern Entity missing_no;
|
|
void start_engine(Level * level)
|
|
{
|
|
Engine game;
|
|
dclear(C_WHITE);
|
|
init_engine(level, &game);
|
|
expo(level->script->prologue, level->script->nb_pro);
|
|
display(&game);
|
|
while(!game.defeat && !game.victory)
|
|
{
|
|
while(game.event_pos<game.nb_event && game.event_list[game.event_pos].turn == game.turn)
|
|
{
|
|
game.x_cursor=game.entity_list[game.turn%game.nb_entity].x;
|
|
game.y_cursor=game.entity_list[game.turn%game.nb_entity].y;
|
|
game.x_view = game.x_cursor;
|
|
game.y_view = game.y_cursor;
|
|
if(game.x_view<3) game.x_view=3;
|
|
if(game.y_view<3) game.y_view=3;
|
|
if(game.x_view>game.map->width-4) game.x_view=game.map->width-4;
|
|
if(game.y_view>game.map->height-4) game.y_view=game.map->height-4;
|
|
|
|
display(&game);
|
|
if(game.event_list[game.event_pos].ev_func!=NULL)
|
|
{
|
|
(*game.event_list[game.event_pos].ev_func)(&game);
|
|
}
|
|
textbox(game.event_list[game.event_pos].dialog);
|
|
while(getkey().key!=KEY_EXE);
|
|
drect(57,30,127,63,C_WHITE);
|
|
game.event_pos++;
|
|
}
|
|
if(game.entity_list[game.turn%game.nb_entity].HP != 0 && game.entity_list[game.turn%game.nb_entity].MP!=0)
|
|
{
|
|
game.x_cursor=game.entity_list[game.turn%game.nb_entity].x;
|
|
game.y_cursor=game.entity_list[game.turn%game.nb_entity].y;
|
|
game.x_view = game.x_cursor;
|
|
game.y_view = game.y_cursor;
|
|
if(game.x_view<3) game.x_view=3;
|
|
if(game.y_view<3) game.y_view=3;
|
|
if(game.x_view>game.map->width-4) game.x_view=game.map->width-4;
|
|
if(game.y_view>game.map->height-4) game.y_view=game.map->height-4;
|
|
switch(game.entity_list[game.turn%game.nb_entity].side)
|
|
{
|
|
case Ally:
|
|
display(&game);
|
|
player(&game);
|
|
break;
|
|
case Foe:
|
|
display(&game);
|
|
ia(&game);
|
|
display(&game);
|
|
break;
|
|
default:
|
|
game.turn++;
|
|
break;
|
|
}
|
|
}else{game.turn++;}
|
|
}
|
|
if(game.victory)
|
|
{
|
|
expo(level->script->epilogue, level->script->nb_epi);
|
|
}
|
|
else
|
|
{
|
|
dclear(C_WHITE);
|
|
dtext(35,25,"Game Over", C_BLACK, C_WHITE);
|
|
dupdate();
|
|
getkey();
|
|
}
|
|
}
|
|
|
|
void textbox(char * str)
|
|
{
|
|
int len = strlen(str);
|
|
int lines = (len/11)+1;
|
|
char buff[12];
|
|
memset(buff,0,12);
|
|
drect(57,30,127,63,C_WHITE);
|
|
for(int i = 0; i<lines; i++)
|
|
{
|
|
dprint(58,30+8*(i%4),C_BLACK, C_WHITE,"%s",strncpy(buff,str+(11*sizeof(char)*i),11));
|
|
if(i%4==3)
|
|
{
|
|
dupdate();
|
|
while(getkey().key!=KEY_EXE);
|
|
drect(57,30,127,63,C_WHITE);
|
|
}
|
|
}
|
|
dupdate();
|
|
}
|
|
|
|
void expo(Slide * slide, int nb_slide)
|
|
{
|
|
int len;
|
|
char buff[22];
|
|
for(int i = 0; i<nb_slide; i++)
|
|
{
|
|
dclear(C_WHITE);
|
|
switch(slide[i].type)
|
|
{
|
|
case Text:
|
|
len = strlen(slide[i].text);
|
|
memset(buff,0,22);
|
|
for(int j = 0; j<((len/21)+1);j++)
|
|
{
|
|
dprint(0,8*j,C_BLACK,C_WHITE,"%s",strncpy(buff,slide[i].text+(sizeof(char)*21*j),21));
|
|
}
|
|
break;
|
|
case Art:
|
|
dimage(0,0,slide[i].art);
|
|
break;
|
|
}
|
|
dupdate();
|
|
while(getkey().key!=KEY_EXE);
|
|
}
|
|
}
|
|
void init_engine(Level * level, Engine * engine)
|
|
{
|
|
engine->map = level->map;
|
|
engine->nb_event = level->script->nb_event;
|
|
engine->event_list = level->script->event_list;
|
|
engine->nb_entity = level->nb_entity;
|
|
engine->entity_list = level->entity_list;
|
|
engine->nb_ally = 0;
|
|
engine->nb_foe = 0;
|
|
for (int i = 0; i < engine->nb_entity; i++)
|
|
{
|
|
switch(engine->entity_list[i].side)
|
|
{
|
|
case Ally:
|
|
engine->nb_ally++;
|
|
break;
|
|
case Foe:
|
|
engine->nb_foe++;
|
|
break;
|
|
default:break;
|
|
}
|
|
}
|
|
engine->turn = 0;
|
|
engine->event_pos=0;
|
|
engine->x_view = 3;
|
|
engine->y_view = 3;
|
|
engine->x_cursor = 3;
|
|
engine->y_cursor = 3;
|
|
engine->victory = false;
|
|
engine->defeat = false;
|
|
}
|
|
void move (Engine * engine)
|
|
{
|
|
Entity * player = &engine->entity_list[engine->turn%engine->nb_entity];
|
|
switch(getkey().key)
|
|
{
|
|
case KEY_UP:
|
|
case KEY_8:
|
|
if(player->y>0)
|
|
{
|
|
if(engine->map->tile[((player->y - 1)*engine->map->width+player->x)].entity->side == Zero)
|
|
{
|
|
engine->map->tile[(player->y - 1)*engine->map->width+player->x].entity = player;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no;
|
|
player->y--;
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_DOWN:
|
|
case KEY_2:
|
|
if(player->y<engine->map->height-1)
|
|
{
|
|
if(engine->map->tile[((player->y + 1)*engine->map->width+player->x)].entity->side == Zero)
|
|
{
|
|
engine->map->tile[(player->y + 1)*engine->map->width+player->x].entity = player;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no;
|
|
player->y++;
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_LEFT:
|
|
case KEY_4:
|
|
if(player->x>0)
|
|
{
|
|
if(engine->map->tile[((player->y)*engine->map->width+player->x - 1)].entity->side == Zero)
|
|
{
|
|
engine->map->tile[(player->y)*engine->map->width+player->x-1].entity = player;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no;
|
|
player->x--;
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_RIGHT:
|
|
case KEY_6:
|
|
if(player->x<engine->map->width-1)
|
|
{
|
|
if(engine->map->tile[((player->y)*engine->map->width+player->x + 1)].entity->side == Zero)
|
|
{
|
|
engine->map->tile[(player->y)*engine->map->width+player->x + 1].entity = player;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no;
|
|
player->x++;
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_5:
|
|
player->MP--;
|
|
engine->turn++;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void sprint(Engine * engine)
|
|
{
|
|
Entity * player = &engine->entity_list[engine->turn%engine->nb_entity];
|
|
switch(getkey().key)
|
|
{
|
|
case KEY_UP:
|
|
case KEY_8:
|
|
if(player->y>1)
|
|
{
|
|
if(engine->map->tile[((player->y - 2)*engine->map->width+player->x)].entity->side == Zero)
|
|
{
|
|
engine->map->tile[(player->y - 2)*engine->map->width+player->x].entity = player;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no;
|
|
player->y-=2;
|
|
player->MP-=2;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_DOWN:
|
|
case KEY_2:
|
|
if(player->y<engine->map->height-2)
|
|
{
|
|
if(engine->map->tile[((player->y + 2)*engine->map->width+player->x)].entity->side == Zero)
|
|
{
|
|
engine->map->tile[(player->y + 2)*engine->map->width+player->x].entity = player;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no;
|
|
player->y+=2;
|
|
player->MP-=2;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_LEFT:
|
|
case KEY_4:
|
|
if(player->x>1)
|
|
{
|
|
if(engine->map->tile[((player->y)*engine->map->width+player->x - 2)].entity->side == Zero)
|
|
{
|
|
engine->map->tile[(player->y)*engine->map->width+player->x-2].entity = player;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no;
|
|
player->x-=2;
|
|
player->MP-=2;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_RIGHT:
|
|
case KEY_6:
|
|
if(player->x<engine->map->width-2)
|
|
{
|
|
if(engine->map->tile[((player->y)*engine->map->width+player->x + 2)].entity->side == Zero)
|
|
{
|
|
engine->map->tile[(player->y)*engine->map->width+player->x + 2].entity = player;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no;
|
|
player->x+=2;
|
|
player->MP-=2;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_5:
|
|
player->MP--;
|
|
engine->turn++;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void atk (Engine * engine)
|
|
{
|
|
Entity * player = &engine->entity_list[engine->turn%engine->nb_entity];
|
|
switch(getkey().key)
|
|
{
|
|
case KEY_UP:
|
|
case KEY_8:
|
|
if(player->y>0)
|
|
{
|
|
if(engine->map->tile[((player->y - 1)*engine->map->width+player->x)].entity->side != Zero)
|
|
{
|
|
engine->map->tile[(player->y - 1)*engine->map->width+player->x].entity->HP -= player->ATK;
|
|
if(engine->map->tile[(player->y - 1)*engine->map->width+player->x].entity->HP<=0)
|
|
{
|
|
engine->nb_foe--;
|
|
engine->map->tile[(player->y - 1)*engine->map->width+player->x].entity = &missing_no;
|
|
}
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_DOWN:
|
|
case KEY_2:
|
|
if(player->y<engine->map->height-1)
|
|
{
|
|
if(engine->map->tile[((player->y + 1)*engine->map->width+player->x)].entity->side != Zero)
|
|
{
|
|
engine->map->tile[(player->y + 1)*engine->map->width+player->x].entity->HP = player->ATK;
|
|
if(engine->map->tile[(player->y + 1)*engine->map->width+player->x].entity->HP<=0)
|
|
{
|
|
engine->nb_foe--;
|
|
engine->map->tile[(player->y + 1)*engine->map->width+player->x].entity = &missing_no;
|
|
}
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_LEFT:
|
|
case KEY_4:
|
|
if(player->x>0)
|
|
{
|
|
if(engine->map->tile[((player->y)*engine->map->width+player->x - 1)].entity->side != Zero)
|
|
{
|
|
engine->map->tile[(player->y)*engine->map->width+player->x-1].entity->HP -= player->ATK;
|
|
if(engine->map->tile[(player->y)*engine->map->width+player->x-1].entity->HP<=0)
|
|
{
|
|
engine->nb_foe--;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x-1].entity = &missing_no;
|
|
}
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_RIGHT:
|
|
case KEY_6:
|
|
if(player->x<engine->map->width-1)
|
|
{
|
|
if(engine->map->tile[((player->y)*engine->map->width+player->x + 1)].entity->side != Zero)
|
|
{
|
|
engine->map->tile[(player->y)*engine->map->width+player->x + 1].entity->HP -= player->ATK;
|
|
if(engine->map->tile[(player->y)*engine->map->width+player->x+1].entity->HP<=0)
|
|
{
|
|
engine->nb_foe--;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x+1].entity = &missing_no;
|
|
}
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
engine->victory = (engine->nb_foe==0);
|
|
}
|
|
|
|
void atk2(Engine * engine)
|
|
{
|
|
Entity * player = &engine->entity_list[engine->turn%engine->nb_entity];
|
|
switch(getkey().key)
|
|
{
|
|
case KEY_UP:
|
|
case KEY_8:
|
|
if(player->y>1)
|
|
{
|
|
if(engine->map->tile[((player->y - 2)*engine->map->width+player->x)].entity->side != Zero)
|
|
{
|
|
engine->map->tile[(player->y - 2)*engine->map->width+player->x].entity->HP -= player->ATK;
|
|
if(engine->map->tile[(player->y - 2)*engine->map->width+player->x].entity->HP<=0)
|
|
{
|
|
engine->nb_foe--;
|
|
engine->map->tile[(player->y - 1)*engine->map->width+player->x].entity = &missing_no;
|
|
}
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_DOWN:
|
|
case KEY_2:
|
|
if(player->y<engine->map->height-2)
|
|
{
|
|
if(engine->map->tile[((player->y + 2)*engine->map->width+player->x)].entity->side != Zero)
|
|
{
|
|
engine->map->tile[(player->y + 2)*engine->map->width+player->x].entity->HP = player->ATK;
|
|
if(engine->map->tile[(player->y + 2)*engine->map->width+player->x].entity->HP<=0)
|
|
{
|
|
engine->nb_foe--;
|
|
engine->map->tile[(player->y + 2)*engine->map->width+player->x].entity = &missing_no;
|
|
}
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_LEFT:
|
|
case KEY_4:
|
|
if(player->x>1)
|
|
{
|
|
if(engine->map->tile[((player->y)*engine->map->width+player->x - 2)].entity->side != Zero)
|
|
{
|
|
engine->map->tile[(player->y)*engine->map->width+player->x-2].entity->HP -= player->ATK;
|
|
if(engine->map->tile[(player->y)*engine->map->width+player->x-2].entity->HP<=0)
|
|
{
|
|
engine->nb_foe--;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x-2].entity = &missing_no;
|
|
}
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_RIGHT:
|
|
case KEY_6:
|
|
if(player->x<engine->map->width-2)
|
|
{
|
|
if(engine->map->tile[((player->y)*engine->map->width+player->x + 2)].entity->side != Zero)
|
|
{
|
|
engine->map->tile[(player->y)*engine->map->width+player->x + 2].entity->HP -= player->ATK;
|
|
if(engine->map->tile[(player->y)*engine->map->width+player->x+2].entity->HP<=0)
|
|
{
|
|
engine->nb_foe--;
|
|
engine->map->tile[(player->y)*engine->map->width+player->x+2].entity = &missing_no;
|
|
}
|
|
player->MP--;
|
|
engine->turn++;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
engine->victory = (engine->nb_foe==0);
|
|
}
|
|
|
|
void display(Engine * engine)
|
|
{
|
|
extern image_t img_grid;
|
|
extern image_t img_forest;
|
|
extern image_t img_mountain;
|
|
extern image_t img_path;
|
|
extern image_t img_cloud;
|
|
extern image_t img_forest_big;
|
|
extern image_t img_mountain_big;
|
|
extern image_t img_path_big;
|
|
extern image_t img_cloud_big;
|
|
extern image_t img_foe;
|
|
extern image_t img_ally;
|
|
extern image_t img_cursor;
|
|
dclear(C_WHITE);
|
|
dimage(0,0,&img_grid);
|
|
for(int i = 0; i < 7; i++)
|
|
{
|
|
for( int j = 0; j < 7 ; j++)
|
|
{
|
|
switch(engine->map->tile[(engine->x_view)-3+j+(engine->map->width)*(engine->y_view-3+i)].type)
|
|
{
|
|
case Forest:
|
|
dimage(j*8+1,i*8+1,&img_forest);
|
|
break;
|
|
case Mountain:
|
|
dimage(j*8+1,i*8+1,&img_mountain);
|
|
break;
|
|
case Path:
|
|
dimage(j*8+1,i*8+1,&img_path);
|
|
break;
|
|
case Cloud:
|
|
dimage(j*8+1,i*8+1,&img_cloud);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
for(int i = 0; i < engine->nb_entity; i++)
|
|
{
|
|
if((engine->entity_list[i].x - engine->x_view)>=-3 && (engine->entity_list[i].y - engine->y_view)>=-3 &&
|
|
(engine->entity_list[i].x - engine->x_view)<=3 && (engine->entity_list[i].y - engine->y_view)<=3)
|
|
{
|
|
switch(engine->entity_list[i].side)
|
|
{
|
|
case Ally:
|
|
dimage((engine->entity_list[i].x - engine->x_view + 3)*8+1,(engine->entity_list[i].y - engine->y_view + 3)*8+1, &img_ally);
|
|
break;
|
|
case Foe:
|
|
dimage((engine->entity_list[i].x - engine->x_view + 3)*8+1,(engine->entity_list[i].y - engine->y_view + 3)*8+1, &img_foe);
|
|
break;
|
|
default:break;
|
|
}
|
|
}
|
|
}
|
|
if(engine->map->tile[engine->x_cursor+(engine->map->width)*(engine->y_cursor)].entity->side==Zero)
|
|
{
|
|
switch(engine->map->tile[engine->x_cursor+(engine->map->width)*(engine->y_cursor)].type)
|
|
{
|
|
case Forest:
|
|
dimage(58,0,&img_forest_big);
|
|
dtext(58,30,"Forest",C_BLACK,C_WHITE);
|
|
break;
|
|
case Mountain:
|
|
dimage(58,0,&img_mountain_big);
|
|
dtext(58,30,"Mountain",C_BLACK,C_WHITE);
|
|
break;
|
|
case Path:
|
|
dimage(58,0,&img_path_big);
|
|
dtext(58,30,"Path",C_BLACK,C_WHITE);
|
|
break;
|
|
case Cloud:
|
|
dimage(58,0,&img_cloud_big);
|
|
dtext(58,30,"Cloud",C_BLACK,C_WHITE);
|
|
break;
|
|
}
|
|
}else{
|
|
Entity * focus =engine->map->tile[engine->x_cursor+(engine->map->width)*(engine->y_cursor)].entity;
|
|
if(focus->side!=Zero)
|
|
{
|
|
dimage(58,0,focus->picture);
|
|
dprint(90,0,C_BLACK,C_WHITE,"%s",focus->name);
|
|
dprint(90,9,C_BLACK,C_WHITE,"HP:%d",focus->HP);
|
|
dprint(90,19,C_BLACK,C_WHITE,"MP:%d",focus->MP);
|
|
}
|
|
}
|
|
if((engine->x_cursor - engine->x_view)>=-3 && (engine->y_cursor - engine->y_view)>=-3 &&
|
|
(engine->x_cursor - engine->x_view)<=3 && (engine->y_cursor - engine->y_view)<=3)
|
|
dimage((engine->x_cursor - engine->x_view + 3)*8,(engine->y_cursor - engine->y_view + 3)*8, &img_cursor);
|
|
dupdate();
|
|
|
|
}
|
|
|
|
|
|
void player(Engine * engine)
|
|
{
|
|
const int old_turn=engine->turn;
|
|
while(old_turn==engine->turn)
|
|
{
|
|
switch(getkey().key)
|
|
{
|
|
case KEY_UP:
|
|
if(engine->y_cursor>0)engine->y_cursor--;
|
|
break;
|
|
case KEY_DOWN:
|
|
if(engine->y_cursor<engine->map->height-1)engine->y_cursor++;
|
|
break;
|
|
case KEY_LEFT:
|
|
if(engine->x_cursor>0)engine->x_cursor--;
|
|
break;
|
|
case KEY_RIGHT:
|
|
if(engine->x_cursor<engine->map->width-1)engine->x_cursor++;
|
|
break;
|
|
case KEY_8:
|
|
if(engine->y_view>3)engine->y_view--;
|
|
break;
|
|
case KEY_2:
|
|
if(engine->y_view<engine->map->height-4)engine->y_view++;
|
|
break;
|
|
case KEY_4:
|
|
if(engine->x_view>3)engine->x_view--;
|
|
break;
|
|
case KEY_6:
|
|
if(engine->x_view<engine->map->width-4)engine->x_view++;
|
|
break;
|
|
case KEY_5:
|
|
engine->x_view = engine->x_cursor;
|
|
engine->y_view = engine->y_cursor;
|
|
if(engine->x_view<3) engine->x_view=3;
|
|
if(engine->y_view<3) engine->y_view=3;
|
|
if(engine->x_view>engine->map->width-4) engine->x_view=engine->map->width-4;
|
|
if(engine->y_view>engine->map->height-4) engine->y_view=engine->map->height-4;
|
|
break;
|
|
case KEY_EXIT:
|
|
engine->defeat= true;
|
|
engine->turn++;
|
|
break;
|
|
case KEY_F1:
|
|
move(engine);
|
|
break;
|
|
case KEY_F2:
|
|
sprint(engine);
|
|
break;
|
|
case KEY_F3:
|
|
atk(engine);
|
|
break;
|
|
case KEY_F4:
|
|
atk2(engine);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
display(engine);
|
|
}
|
|
if(engine->entity_list[old_turn%engine->nb_entity].MP<=0)
|
|
{
|
|
engine->nb_ally--;
|
|
engine->map->tile[engine->entity_list[old_turn%engine->nb_entity].x+(engine->map->width)*engine->entity_list[old_turn%engine->nb_entity].y].entity = &missing_no;
|
|
engine->defeat = (engine->nb_ally == 0);
|
|
}
|
|
}
|
|
|
|
void ia(Engine * engine)
|
|
{
|
|
Entity * foe = &engine->entity_list[engine->turn%engine->nb_entity];
|
|
if(foe->x>0 && engine->map->tile[foe->x-1+foe->y*engine->map->width].entity->side == Ally)
|
|
{
|
|
Entity * target = engine->map->tile[foe->x-1+foe->y*engine->map->width].entity;
|
|
dtext(0,0,"0",C_BLACK,C_WHITE);
|
|
dupdate();
|
|
getkey();
|
|
target->HP-=foe->ATK;
|
|
if(target->HP<=0)
|
|
{
|
|
engine->nb_ally--;
|
|
engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no;
|
|
engine->defeat = (engine->nb_ally == 0);
|
|
}
|
|
foe->MP--;
|
|
engine->turn++;
|
|
} else if(foe->y>0 && engine->map->tile[foe->x+(foe->y-1)*engine->map->width].entity->side == Ally)
|
|
{
|
|
Entity * target = engine->map->tile[foe->x+(foe->y-1)*engine->map->width].entity;
|
|
dtext(0,0,"1",C_BLACK,C_WHITE);
|
|
dupdate();
|
|
getkey();
|
|
target->HP-=foe->ATK;
|
|
if(target->HP<=0)
|
|
{
|
|
engine->nb_ally--;
|
|
engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no;
|
|
engine->defeat = (engine->nb_ally == 0);
|
|
}
|
|
foe->MP--;
|
|
engine->turn++;
|
|
} else if(foe->x<engine->map->width-1 && engine->map->tile[foe->x+1+(foe->y)*engine->map->width].entity->side == Ally)
|
|
{
|
|
Entity * target = engine->map->tile[foe->x+1+(foe->y)*engine->map->width].entity;
|
|
dtext(0,0,"2",C_BLACK,C_WHITE);
|
|
dupdate();
|
|
getkey();
|
|
target->HP-=foe->ATK;
|
|
if(target->HP<=0)
|
|
{
|
|
engine->nb_ally--;
|
|
engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no;
|
|
engine->defeat = (engine->nb_ally == 0);
|
|
}
|
|
foe->MP--;
|
|
engine->turn++;
|
|
} else if(foe->y<engine->map->height-1 && engine->map->tile[foe->x+(foe->y+1)*engine->map->width].entity->side == Ally)
|
|
{
|
|
Entity * target = engine->map->tile[foe->x+(foe->y+1)*engine->map->width].entity;
|
|
dtext(0,0,"3",C_BLACK,C_WHITE);
|
|
dupdate();
|
|
getkey();
|
|
target->HP-=foe->ATK;
|
|
if(target->HP<=0)
|
|
{
|
|
engine->nb_ally--;
|
|
engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no;
|
|
engine->defeat = (engine->nb_ally == 0);
|
|
}
|
|
foe->MP--;
|
|
engine->turn++;
|
|
}else if(foe->x>1 && engine->map->tile[foe->x-2+foe->y*engine->map->width].entity->side == Ally)
|
|
{
|
|
Entity * target = engine->map->tile[foe->x-2+foe->y*engine->map->width].entity;
|
|
dtext(0,0,"4",C_BLACK,C_WHITE);
|
|
dupdate();
|
|
getkey();
|
|
target->HP-=foe->ATK;
|
|
if(target->HP<=0)
|
|
{
|
|
engine->nb_ally--;
|
|
engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no;
|
|
engine->defeat = (engine->nb_ally == 0);
|
|
}
|
|
foe->MP-=2;
|
|
engine->turn++;
|
|
} else if(foe->y>1 && engine->map->tile[foe->x+(foe->y-2)*engine->map->width].entity->side == Ally)
|
|
{
|
|
Entity * target = engine->map->tile[foe->x+(foe->y-2)*engine->map->width].entity;
|
|
dtext(0,0,"5",C_BLACK,C_WHITE);
|
|
dupdate();
|
|
getkey();
|
|
target->HP-=foe->ATK;
|
|
if(target->HP<=0)
|
|
{
|
|
engine->nb_ally--;
|
|
engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no;
|
|
engine->defeat = (engine->nb_ally == 0);
|
|
}
|
|
foe->MP-=2;
|
|
engine->turn++;
|
|
} else if(foe->x<engine->map->width-2 && engine->map->tile[foe->x+2+(foe->y)*engine->map->width].entity->side == Ally)
|
|
{
|
|
Entity * target = engine->map->tile[foe->x+2+(foe->y)*engine->map->width].entity;
|
|
dtext(0,0,"6",C_BLACK,C_WHITE);
|
|
dupdate();
|
|
getkey();
|
|
target->HP-=foe->ATK;
|
|
if(target->HP<=0)
|
|
{
|
|
engine->nb_ally--;
|
|
engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no;
|
|
engine->defeat = (engine->nb_ally == 0);
|
|
}
|
|
foe->MP-=2;
|
|
engine->turn++;
|
|
} else if(foe->y<engine->map->height-2 && engine->map->tile[foe->x+(foe->y+2)*engine->map->width].entity->side == Ally)
|
|
{
|
|
Entity * target = engine->map->tile[foe->x+(foe->y+2)*engine->map->width].entity;
|
|
dtext(0,0,"7",C_BLACK,C_WHITE);
|
|
dupdate();
|
|
getkey();
|
|
target->HP-=foe->ATK;
|
|
if(target->HP<=0)
|
|
{
|
|
engine->nb_ally--;
|
|
engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no;
|
|
engine->defeat = (engine->nb_ally == 0);
|
|
}
|
|
foe->MP-=2;
|
|
engine->turn++;
|
|
}else{ int target_id=0;
|
|
dtext(0,0,"8",C_BLACK,C_WHITE);
|
|
dupdate();
|
|
getkey();
|
|
while(engine->entity_list[target_id].HP == 0 ||engine->entity_list[target_id].MP==0)
|
|
{
|
|
target_id++;
|
|
}
|
|
Entity * target = &engine->entity_list[target_id];
|
|
int dx = target->x - foe->x;
|
|
int dy = target->y - foe->y;
|
|
if (dy > 2)
|
|
{
|
|
dtext(0,0,"9",C_BLACK,C_WHITE);
|
|
dupdate();
|
|
getkey();
|
|
if(engine->map->tile[foe->x+engine->map->width*(foe->y+2)].entity->side==Zero)
|
|
{
|
|
foe->MP-=2;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y+2)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->y+=2;
|
|
}else if(engine->map->tile[foe->x+engine->map->width*(foe->y+1)].entity->side==Zero)
|
|
{
|
|
foe->MP--;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y+1)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->y+=1;
|
|
}else{
|
|
foe->MP--;
|
|
}
|
|
}else if (dy < -2)
|
|
{
|
|
if(engine->map->tile[foe->x+engine->map->width*(foe->y-2)].entity->side==Zero)
|
|
{
|
|
foe->MP-=2;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y-2)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->y-=2;
|
|
}else if(engine->map->tile[foe->x+engine->map->width*(foe->y-1)].entity->side==Zero)
|
|
{
|
|
foe->MP--;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y-1)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->y-=1;
|
|
}else{
|
|
foe->MP--;
|
|
}
|
|
}else if (dx > 2)
|
|
{
|
|
if(engine->map->tile[foe->x+2+engine->map->width*(foe->y)].entity->side==Zero)
|
|
{
|
|
foe->MP-=2;
|
|
engine->map->tile[foe->x+2+engine->map->width*(foe->y)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->x+=2;
|
|
}else if(engine->map->tile[foe->x+1+engine->map->width*(foe->y)].entity->side==Zero)
|
|
{
|
|
foe->MP--;
|
|
engine->map->tile[foe->x+1+engine->map->width*(foe->y)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->x+=1;
|
|
}else{
|
|
foe->MP--;
|
|
}
|
|
}else if (dx < -2)
|
|
{
|
|
if(engine->map->tile[foe->x-2+engine->map->width*(foe->y)].entity->side==Zero)
|
|
{
|
|
foe->MP-=2;
|
|
engine->map->tile[foe->x-2+engine->map->width*(foe->y)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->x-=2;
|
|
}else if(engine->map->tile[foe->x-1+engine->map->width*(foe->y)].entity->side==Zero)
|
|
{
|
|
foe->MP--;
|
|
engine->map->tile[foe->x-1+engine->map->width*(foe->y)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->x-=1;
|
|
}else{
|
|
foe->MP--;
|
|
}
|
|
}else if (dy == 1)
|
|
{
|
|
if(engine->map->tile[foe->x+engine->map->width*(foe->y+1)].entity->side==Zero)
|
|
{
|
|
foe->MP--;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y+1)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->y+=1;
|
|
}else{
|
|
foe->MP--;
|
|
}
|
|
}else if (dy == -1)
|
|
{
|
|
if(engine->map->tile[foe->x+engine->map->width*(foe->y-1)].entity->side==Zero)
|
|
{
|
|
foe->MP--;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y-1)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->y-=1;
|
|
}else{
|
|
foe->MP--;
|
|
}
|
|
}else if (dx == 1)
|
|
{
|
|
if(engine->map->tile[foe->x+1+engine->map->width*(foe->y)].entity->side==Zero)
|
|
{
|
|
foe->MP--;
|
|
engine->map->tile[foe->x+1+engine->map->width*(foe->y)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->x+=1;
|
|
}else{
|
|
foe->MP--;
|
|
}
|
|
}else if (dx == -1)
|
|
{
|
|
if(engine->map->tile[foe->x-1+engine->map->width*(foe->y)].entity->side==Zero)
|
|
{
|
|
foe->MP--;
|
|
engine->map->tile[foe->x-1+engine->map->width*(foe->y)].entity = foe;
|
|
engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no;
|
|
foe->x-=1;
|
|
}else{
|
|
foe->MP--;
|
|
}
|
|
}
|
|
engine->turn++;
|
|
}
|
|
if (foe->MP<=0)
|
|
{
|
|
engine->nb_foe--;
|
|
engine->map->tile[foe->x+(engine->map->width)*foe->y].entity = &missing_no;
|
|
engine->victory = (engine->nb_foe == 0);
|
|
}
|
|
}
|