80 lines
2.3 KiB
C
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();
|
|
}
|