diff --git a/CMakeLists.txt b/CMakeLists.txt index 29aa970..903fd13 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,7 +61,8 @@ set(ASSETS_cg assets-cg/uf8x9 assets-cg/capacites/capacites.txt assets-cg/monsters/test.png - assets-cg/monsters/test.json + assets-cg/monsters/test2.png + assets-cg/monsters/monsters.txt ) fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA) diff --git a/assets-cg/converters.py b/assets-cg/converters.py index 074d7c4..981e941 100644 --- a/assets-cg/converters.py +++ b/assets-cg/converters.py @@ -187,11 +187,20 @@ def parseZone(layer): zone += fxconv.u32(to[0]) zone += fxconv.u32(to[1]) + monsters = bytes() try: zone += fxconv.u32(i["properties"][0]["value"]) + monster_list = i["properties"][1]["value"].split(";") + zone += fxconv.u32(len(monster_list)) + for j in monster_list: + monsters += fxconv.u16(int(j)) + except IndexError: + raise Exception(f"parseZone() : La zone {origin};{to} n'a pas de monstres associés") except KeyError: print(f"parseZone() : Zone {origin};{to} sans niveau de référence, passage automatique à -1") zone += fxconv.u32(-1) + + zone += fxconv.ptr(monsters) return zone def convert_capa(input, output, params, target): @@ -229,23 +238,35 @@ def convert_capa(input, output, params, target): fxconv.elf(capacities, output, "_" + params["name"], **target) def convert_monster(input, output, params, target): - file = open(input, "r") - data = json.load(file) + liste_file = list(pathlib.Path(input).parent.glob('*.json')) - stats = fxconv.Structure() - if len(data["stats"]) != 6: raise Exception(f"convert_monster : Les statistiques de {data['name']} sont mauvaises") - for i in data["stats"].values(): - stats+=fxconv.u32(i) + monsters = fxconv.Structure() + monsters += fxconv.u32(len(liste_file)) + for f in liste_file: + file = open(f,"r") + data = json.load(file) + stats = fxconv.Structure() - moves = bytes() - for i in data["moves"]: - moves+=fxconv.u16(i) + if len(data["stats"]) != 4: raise Exception(f"convert_monster : Les statistiques de {data['name']} sont mauvaises") + stats+=fxconv.u32(data["stats"]["atk"]) + stats+=fxconv.u32(data["stats"]["def"]) + stats+=fxconv.u32(data["stats"]["pv"]) + stats+=fxconv.u32(1) + stats+=fxconv.u32(data["stats"]["xp"]) + stats+=fxconv.u32(data["stats"]["pv"]) - monster = fxconv.Structure() - monster += fxconv.string(data["name"]) - monster += fxconv.ptr(f"img_{data['sprite']}") - monster += fxconv.u32(len(data["moves"])) - monster += fxconv.ptr(stats) - monster += fxconv.ptr(moves) + moves = bytes() + for i in data["moves"]: + moves+=fxconv.u16(i) - fxconv.elf(monster, output, "_" + params["name"], **target) + monster = fxconv.Structure() + monster += fxconv.string(data["name"]) + monster += fxconv.ptr(f"img_{data['sprite']}") + monster += fxconv.u32(data["id"]) + monster += fxconv.u32(len(data["moves"])) + monster += fxconv.ptr(stats) + monster += fxconv.ptr(moves) + + monsters += fxconv.ptr(monster) + + fxconv.elf(monsters, output, "_" + params["name"], **target) diff --git a/assets-cg/maps/testCarte.tmx b/assets-cg/maps/testCarte.tmx index 8d3030a..501b052 100644 --- a/assets-cg/maps/testCarte.tmx +++ b/assets-cg/maps/testCarte.tmx @@ -205,11 +205,13 @@ + + diff --git a/assets-cg/monsters/fxconv-metadata.txt b/assets-cg/monsters/fxconv-metadata.txt index 74a2ef7..57a725c 100644 --- a/assets-cg/monsters/fxconv-metadata.txt +++ b/assets-cg/monsters/fxconv-metadata.txt @@ -1,7 +1,7 @@ -test.png: +*.png: type: bopti-image - name: img_test + name_regex: (.*)\.png img_\1 -*.json: +monsters.txt: custom-type: monster - name_regex: (.*)\.json monster_\1 + name: monsters diff --git a/assets-cg/monsters/monsters.txt b/assets-cg/monsters/monsters.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/monsters/test.json b/assets-cg/monsters/test.json index 25bbb0a..87912f6 100644 --- a/assets-cg/monsters/test.json +++ b/assets-cg/monsters/test.json @@ -1,13 +1,12 @@ { "name":"test", "sprite":"test", + "id":1, "stats":{ "atk":10, "def":10, "pv":20, - "level":1, - "xp":300, - "max_pv":20 + "xp":300 }, "moves":[ 0, diff --git a/assets-cg/monsters/test2.json b/assets-cg/monsters/test2.json new file mode 100644 index 0000000..167da9d --- /dev/null +++ b/assets-cg/monsters/test2.json @@ -0,0 +1,16 @@ +{ + "name":"Citron", + "sprite":"test2", + "id":2, + "stats":{ + "atk":80, + "def":5, + "pv":45, + "xp":150 + }, + "moves":[ + 0, + 1, + 2 + ] +} diff --git a/assets-cg/monsters/test2.png b/assets-cg/monsters/test2.png new file mode 100644 index 0000000..a328f5a Binary files /dev/null and b/assets-cg/monsters/test2.png differ diff --git a/include/map.h b/include/map.h index 67870e6..ba8b361 100644 --- a/include/map.h +++ b/include/map.h @@ -12,6 +12,8 @@ struct Zone { int start_x, start_y; int end_x, end_y; int level; + int nbMonsters; + short *monsters; }; struct Map { @@ -53,4 +55,5 @@ struct Vec2 locate_tile(struct Map const *map, int tile); struct Teleporter get_teleporter_xy(struct Map *map, struct Vec2 pos); -int get_level_zone(struct Player *player, struct Map *map); \ No newline at end of file +int is_in_zone(struct Player *player, struct Map *map); +struct Zone get_zone(struct Player *player, struct Map *map); \ No newline at end of file diff --git a/include/monster.h b/include/monster.h index 71bacb1..e9e2e38 100644 --- a/include/monster.h +++ b/include/monster.h @@ -8,11 +8,18 @@ struct Monster { char *name; bopti_image_t *sprite; + int id; int nbMoves; struct Stats *stats; short *moves; }; +struct Monsters { + int nbMonsters; + struct Monster *monster[]; +}; + +struct Monster *get_monster_id(int id); struct Monster *generate_monster(struct Game *game); struct Move *monster_select(struct Player *player, struct Monster *monster); struct Monster *copyMonster(struct Monster *source); diff --git a/src/map.c b/src/map.c index 7b7a738..84ec366 100644 --- a/src/map.c +++ b/src/map.c @@ -67,12 +67,22 @@ struct Teleporter get_teleporter_xy(struct Map *map, struct Vec2 pos) { return map->teleporters[0]; } -int get_level_zone(struct Player *player, struct Map *map) { +int is_in_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; + struct Zone zone = map->zones[i]; + if(zone.start_x <= posx && zone.start_y <= posy && zone.end_x >= posx && zone.end_y >= posy) return 1; } - return -1; + return 0; +} + +struct Zone get_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++) { + 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; + } + return map->zones[0]; } \ No newline at end of file diff --git a/src/monster.c b/src/monster.c index fd375ce..1d045e2 100644 --- a/src/monster.c +++ b/src/monster.c @@ -9,16 +9,33 @@ #include "map.h" #include "util.h" + +#include +#include + +extern struct Monsters monsters; + +struct Monster *get_monster_id(int id) { + for(int i = 0; i < monsters.nbMonsters; i++) { + if(monsters.monster[i]->id == id) return monsters.monster[i]; + } + return monsters.monster[0]; +} + struct Monster *generate_monster(struct Game *game) { - extern struct Monster monster_test; - - struct Monster *monster = copyMonster(&monster_test); - srand(rtc_ticks()); - int level_zone = get_level_zone(game->player, game->map); - //En cas d'erreur / aucune zone trouvée - if(level_zone == -1) { + + int level_zone; + + //set the monster depends of the current zone + struct Monster *monster; + if(is_in_zone(game->player, game->map)) { + struct Zone zone = get_zone(game->player, game->map); + monster = copyMonster(get_monster_id(zone.monsters[rand_range(0,zone.nbMonsters)])); + level_zone = zone.level; + } else { + monster = copyMonster(get_monster_id(0)); level_zone = game->player->stats.level; } @@ -62,6 +79,7 @@ struct Monster *copyMonster(struct Monster *source) { dest->name = source->name; dest->nbMoves = source->nbMoves; dest->sprite = source->sprite; + dest->id = source->id; dest->moves = malloc(dest->nbMoves * sizeof *source->moves); memcpy(dest->moves, source->moves, dest->nbMoves * sizeof *source->moves); diff --git a/src/player.c b/src/player.c index f485256..c54aaec 100644 --- a/src/player.c +++ b/src/player.c @@ -93,7 +93,7 @@ void replace_capacities(struct Player *player, struct Move move) { if(selection > NB_PLAYER_MOVES-1) selection = NB_PLAYER_MOVES-1; if(selection < 0) selection = 0; - // draw_classic_move(200,DHEIGHT/2-30, move); + draw_classic_move(200,DHEIGHT/2-30, &move); for(int i = 0; i < NB_PLAYER_MOVES; i++) { draw_classic_move(0,65*i, player->moves[i]); }