Areas for level

This commit is contained in:
bgiraudr 2022-02-17 00:02:00 +01:00
parent e01c72f50a
commit cb8a7db95a
7 changed files with 112 additions and 39 deletions

View File

@ -26,6 +26,7 @@ def convert_map(input, output, params, target):
DIALOG_LAYOUT = "dialog"
TELEPORTER_LAYOUT = "teleporter"
ZONE_LAYOUT = "zone"
data = json.load(open(input, "r"))
@ -79,9 +80,11 @@ def convert_map(input, output, params, target):
nbDialog = 0
nbTelep = 0
nbZone = 0
structMap = fxconv.Structure()
dialogs = fxconv.Structure()
teleporter = fxconv.Structure()
zone = fxconv.Structure()
for layer in objectLayers:
if layer.get("name") == DIALOG_LAYOUT:
@ -90,14 +93,18 @@ def convert_map(input, output, params, target):
elif layer.get("name") == TELEPORTER_LAYOUT:
nbTelep = len(layer["objects"])
teleporter = parseTeleporter(layer)
elif layer.get("name") == ZONE_LAYOUT:
nbZone = len(layer["objects"])
zone = parseZone(layer)
else:
print("UNKNOWN LAYOUT FOUND : " + layer.get("name"))
structMap += fxconv.u32(w) + fxconv.u32(h) + fxconv.u32(nbTilelayer) + fxconv.u32(nbDialog) + fxconv.u32(nbTelep)
structMap += fxconv.u32(w) + fxconv.u32(h) + fxconv.u32(nbTilelayer) + fxconv.u32(nbDialog) + fxconv.u32(nbTelep) + fxconv.u32(nbZone)
structMap += fxconv.ref(f"img_{nameTilesetFree}")
structMap += fxconv.u32(tileset_size)
structMap += fxconv.ptr(dialogs)
structMap += fxconv.ptr(teleporter)
structMap += fxconv.ptr(zone)
#generation of the collision map (take the maximum of the layer except for bridges)
#bridges are always walkable
@ -168,6 +175,24 @@ def parseTeleporter(layer):
raise Exception("parseTeleporter() : Un téléporteur est mal configuré")
return teleporter
def parseZone(layer):
zone = fxconv.Structure()
for i in layer["objects"]:
origin = (int(i['x']/16), int(i['y']/16))
to = (int(origin[0]+i['width']/16)-1, int(origin[1]+i['height']/16)-1)
zone += fxconv.u32(origin[0])
zone += fxconv.u32(origin[1])
zone += fxconv.u32(to[0])
zone += fxconv.u32(to[1])
try:
zone += fxconv.u32(i["properties"][0]["value"])
except KeyError:
print("parseZone() : Zone sans niveau de référence, passage automatique à -1")
zone += fxconv.u32(-1)
return zone
def convert_capa(input, output, params, target):
with open(input, "r") as file:
capacities = fxconv.Structure()

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.5" tiledversion="1.7.2" orientation="orthogonal" renderorder="right-down" width="15" height="10" tilewidth="16" tileheight="16" infinite="0" nextlayerid="15" nextobjectid="37">
<map version="1.8" tiledversion="1.8.1" orientation="orthogonal" renderorder="right-down" width="15" height="10" tilewidth="16" tileheight="16" infinite="0" nextlayerid="16" nextobjectid="43">
<editorsettings>
<export target="interior_1.json" format="json"/>
</editorsettings>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.8" tiledversion="1.8.0" orientation="orthogonal" renderorder="right-down" width="100" height="38" tilewidth="16" tileheight="16" infinite="0" nextlayerid="12" nextobjectid="54">
<map version="1.8" tiledversion="1.8.1" orientation="orthogonal" renderorder="right-down" width="100" height="38" tilewidth="16" tileheight="16" infinite="0" nextlayerid="14" nextobjectid="59">
<editorsettings>
<export target="testCarte.json" format="json"/>
</editorsettings>
@ -201,4 +201,16 @@
</properties>
</object>
</objectgroup>
<objectgroup id="13" name="zone">
<object id="57" x="400" y="464" width="32" height="48">
<properties>
<property name="level" type="int" value="30"/>
</properties>
</object>
<object id="58" x="304" y="560" width="112" height="32">
<properties>
<property name="level" type="int" value="5"/>
</properties>
</object>
</objectgroup>
</map>

View File

@ -8,15 +8,22 @@ struct Teleporter {
int x2, y2;
};
struct Zone {
int start_x, start_y;
int end_x, end_y;
int level;
};
struct Map {
/*width, height and the number of layer of the map*/
int w, h, nb_layers, dialog_count, teleporter_count;
int w, h, nb_layers, dialog_count, teleporter_count, zone_count;
/*the tileset to use*/
bopti_image_t *tileset;
int tileset_size;
/*list of all the dialog*/
struct Talkable *dialogs;
struct Teleporter *teleporters;
struct Zone *zones;
/*state of each tile on the map (solid, air ...)*/
short *info_map;
/*list of all the tiles*/
@ -44,4 +51,6 @@ void set_map(struct Game *game, int id);
struct Vec2 locate_tile(struct Map const *map, int tile);
struct Teleporter get_teleporter_xy(struct Map *map, struct Vec2 pos);
struct Teleporter get_teleporter_xy(struct Map *map, struct Vec2 pos);
int get_level_zone(struct Player *player, struct Map *map);

View File

@ -13,6 +13,9 @@
extern bopti_image_t img_dialogue;
/**
* create a new battle
*/
void create_battle(struct Game *game) {
game->player->stats.pv = game->player->stats.max_pv;
struct Monster *monster = generate_monster(game);
@ -21,6 +24,9 @@ void create_battle(struct Game *game) {
finish_battle(status, game, monster);
}
/**
* Launch the battle
*/
int battle(struct Player *player, struct Monster *monster) {
int tour = 0;
int selection = 0;
@ -73,6 +79,42 @@ int battle(struct Player *player, struct Monster *monster) {
return LOSE;
}
/*When a battle is finish, compute xp gain and gain level*/
void finish_battle(int status, struct Game *game, struct Monster *monster) {
if(status == WIN) {
//gain d'xp
int xp = ceil((monster->stats->xp*monster->stats->level*1.5)/7);
dimage(42,DHEIGHT-75,&img_dialogue);
dprint(50,DHEIGHT-75/2-10, C_BLACK, "Vous remportez %d points d'experience", xp);
dupdate();
wait_for_input(KEY_SHIFT);
game->player->stats.xp += xp;
//niveau suivant une progession N³
int calc_level = (int)pow(game->player->stats.xp, 0.33);
for(int i = game->player->stats.level; i < calc_level; i++) {
draw_battle(game->player, monster);
dimage(42,DHEIGHT-75,&img_dialogue);
dprint(50,DHEIGHT-75/2-10,C_BLACK,"Vous passez au niveau %d !", i+1);
dupdate();
wait_for_input(KEY_SHIFT);
}
game->player->stats.level = calc_level;
set_stats_level_from(&game->player->base_stats, &game->player->stats);
} else if(status == LOSE) {
game->player->stats.pv = 0;
}
free_monster(monster);
}
/**
* Select a move in the list
*/
int select_move(struct Player *player, struct Monster *monster, int prec_selected) {
const int nbMove = get_nb_moves(player);
int selection = prec_selected;
@ -157,36 +199,4 @@ void draw_executed_move(struct Move *move, struct Monster *monster, int is_monst
void draw_crit() {
dimage(42,DHEIGHT-75,&img_dialogue);
dprint(50,DHEIGHT-75/2-10, C_BLACK, "Coup critique !");
}
void finish_battle(int status, struct Game *game, struct Monster *monster) {
if(status == WIN) {
//gain d'xp
int xp = ceil((monster->stats->xp*monster->stats->level*1.5)/7);
dimage(42,DHEIGHT-75,&img_dialogue);
dprint(50,DHEIGHT-75/2-10, C_BLACK, "Vous remportez %d points d'experience", xp);
dupdate();
wait_for_input(KEY_SHIFT);
game->player->stats.xp += xp;
//niveau suivant une progession N³
int calc_level = (int)pow(game->player->stats.xp, 0.33);
for(int i = game->player->stats.level; i < calc_level; i++) {
draw_battle(game->player, monster);
dimage(42,DHEIGHT-75,&img_dialogue);
dprint(50,DHEIGHT-75/2-10,C_BLACK,"Vous passez au niveau %d !", i+1);
dupdate();
wait_for_input(KEY_SHIFT);
}
game->player->stats.level = calc_level;
set_stats_level_from(&game->player->base_stats, &game->player->stats);
} else if(status == LOSE) {
game->player->stats.pv = 0;
}
free_monster(monster);
}

View File

@ -65,4 +65,14 @@ struct Teleporter get_teleporter_xy(struct Map *map, struct Vec2 pos) {
i++;
}
return map->teleporters[0];
}
int get_level_zone(struct Player *player, struct Map *map) {
const int posx = player->pos.x;
const int posy = player->pos.y;
for(int i = 0; i < map->zone_count; i++) {
const struct Zone zone = map->zones[i];
if(zone.start_x <= posx && zone.start_y <= posy && zone.end_x >= posx && zone.end_y >= posy) return zone.level;
}
return -1;
}

View File

@ -5,14 +5,21 @@
#include "stats.h"
#include "capacite.h"
#include "player.h"
#include "map.h"
struct Monster *generate_monster(struct Game *game) {
extern struct Monster monster_test;
struct Monster *monster = copyMonster(&monster_test);
// TODO formule pour niveau du monstre adverse
monster->stats->level = game->player->stats.level;
int level_zone = get_level_zone(game->player, game->map);
//En cas d'erreur / aucune zone trouvée
if(level_zone == -1) {
level_zone = game->player->stats.level;
}
monster->stats->level = level_zone;
set_stats_level(monster->stats);
monster->stats->pv = monster->stats->max_pv;
return monster;