Files
dusk/src/dusk/rpg/battle/move/battlemove.c
T

80 lines
2.3 KiB
C

/**
* Copyright (c) 2026 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "battlemove.h"
#include "asset/asset.h"
#include "asset/loader/assetloader.h"
#include "assert/assert.h"
#include "util/memory.h"
#include "util/string.h"
battleability_t BATTLE_MOVES[BATTLE_MOVE_COUNT_MAX];
uint8_t BATTLE_MOVE_COUNT;
errorret_t battleMoveInit(void) {
memoryZero(BATTLE_MOVES, sizeof(BATTLE_MOVES));
BATTLE_MOVE_COUNT = BATTLE_MOVE_ID_NULL;
// Get moves JSON.
assetentry_t *entry = assetLock(
"battle/moves.jsonc", ASSET_LOADER_TYPE_JSON, NULL
);
errorret_t ret = assetRequireLoaded(entry);
if(errorIsNotOk(ret)) {
assetUnlockEntry(entry);
errorChain(ret);
}
yyjson_val *root = yyjson_doc_get_root(entry->data.json);
yyjson_val *moves = yyjson_obj_get(root, "moves");
yyjson_obj_iter iter = yyjson_obj_iter_with(moves);
yyjson_val *key;
while((key = yyjson_obj_iter_next(&iter))) {
assertTrue(
BATTLE_MOVE_COUNT < BATTLE_MOVE_COUNT_MAX,
"Too many battle moves defined."
);
yyjson_val *val = yyjson_obj_iter_get_val(key);
battlemoveid_t id = BATTLE_MOVE_COUNT++;
battleability_t *move = &BATTLE_MOVES[id];
stringCopy(move->name, yyjson_get_str(key), BATTLE_MOVE_NAME_MAX);
battletarget_t target = 0;
if(yyjson_get_bool(yyjson_obj_get(val, "enemies"))) {
target |= BATTLE_TARGET_ENEMIES;
}
if(yyjson_get_bool(yyjson_obj_get(val, "allies"))) {
target |= BATTLE_TARGET_ALLIES;
}
if(yyjson_get_bool(yyjson_obj_get(val, "multiple"))) {
target |= BATTLE_TARGET_MULTIPLE;
}
if(yyjson_get_bool(yyjson_obj_get(val, "self"))) {
target |= BATTLE_TARGET_SELF;
}
move->target = target;
const char_t *defaultTarget = yyjson_get_str(
yyjson_obj_get(val, "default")
);
if(defaultTarget != NULL && stringEquals(defaultTarget, "enemy")) {
move->targetDefault = BATTLE_TARGET_ENEMIES;
} else if(defaultTarget != NULL && stringEquals(defaultTarget, "ally")) {
move->targetDefault = BATTLE_TARGET_ALLIES;
} else if(defaultTarget != NULL && stringEquals(defaultTarget, "self")) {
move->targetDefault = BATTLE_TARGET_SELF;
} else {
move->targetDefault = 0;
}
}
assetUnlockEntry(entry);
errorOk();
}