111 lines
2.9 KiB
C
111 lines
2.9 KiB
C
/**
|
|
* Copyright (c) 2025 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "rpg.h"
|
|
#include "entity/entity.h"
|
|
#include "rpg/entity/npc/npcpath.h"
|
|
#include "rpg/entity/item/entityitem.h"
|
|
#include "rpg/overworld/map.h"
|
|
#include "rpg/overworld/maparea.h"
|
|
#include "rpg/cutscene/cutscenesystem.h"
|
|
#include "rpg/cutscene/scene/testcutscene.h"
|
|
#include "rpg/item/backpack.h"
|
|
#include "rpg/battle/party.h"
|
|
#include "ui/rpg/textbox/uitextboxminilist.h"
|
|
#include "time/time.h"
|
|
#include "rpgcamera.h"
|
|
#include "util/memory.h"
|
|
#include "util/string.h"
|
|
#include "assert/assert.h"
|
|
#include "console/console.h"
|
|
|
|
#include "ui/rpg/uiemoji.h"
|
|
|
|
void rpgTestAreaCallback(entity_t *entity, const uint8_t trigger) {
|
|
consolePrint("rpgTestAreaCallback: trigger=%u", trigger);
|
|
}
|
|
|
|
errorret_t rpgInit(void) {
|
|
memoryZero(ENTITIES, sizeof(ENTITIES));
|
|
memoryZero(MAP_AREAS, sizeof(MAP_AREAS));
|
|
|
|
backpackInit();
|
|
partyInit();
|
|
cutsceneSystemInit();
|
|
|
|
errorChain(mapInit());
|
|
|
|
rpgCameraInit();
|
|
// Init world
|
|
errorChain(mapPositionSet((chunkpos_t){ 0, 0, 0 }));
|
|
|
|
// TEST: Create some entities.
|
|
uint8_t entIndex = entityGetAvailable();
|
|
assertTrue(entIndex != 0xFF, "No available entity slots!.");
|
|
entity_t *ent = &ENTITIES[entIndex];
|
|
entityInit(ent, ENTITY_TYPE_PLAYER);
|
|
entityPositionSet(ent, (worldpos_t){ 10, 2, 0 });// Also assigns the chunk.
|
|
RPG_CAMERA.mode = RPG_CAMERA_MODE_FOLLOW_ENTITY;
|
|
RPG_CAMERA.followEntity.followEntityId = ent->id;
|
|
|
|
mapSpawnEntity(3, (worldpos_t){ 8, 8, 1 });
|
|
|
|
// TEST: Place an item entity.
|
|
uint8_t itemEntIndex = entityGetAvailable();
|
|
assertTrue(itemEntIndex != 0xFF, "No available entity slots!.");
|
|
entity_t *itemEnt = &ENTITIES[itemEntIndex];
|
|
entityInit(itemEnt, ENTITY_TYPE_ITEM);
|
|
entityItemSet(itemEnt, ITEM_ID_POTION, 1);
|
|
entityPositionSet(itemEnt, (worldpos_t){ 12, 2, 0 });
|
|
|
|
// TEST: Give the player a starting assortment of items.
|
|
backpackAdd(ITEM_ID_POTION, 5);
|
|
backpackAdd(ITEM_ID_POTATO, 3);
|
|
backpackAdd(ITEM_ID_APPLE, 8);
|
|
|
|
// TEST: Create a test map area.
|
|
uint8_t areaIndex = mapAreaAdd(
|
|
(worldpos_t){ 11, 3, 0 },
|
|
(worldpos_t){ 16, 9, 10 },
|
|
rpgTestAreaCallback,
|
|
MAP_AREA_NOTIFY_ALL,
|
|
MAP_TRIGGER_ENTER | MAP_TRIGGER_EXIT
|
|
);
|
|
assertTrue(areaIndex != 0xFF, "No available map area slots!.");
|
|
|
|
// All Good!
|
|
errorOk();
|
|
}
|
|
|
|
errorret_t rpgUpdate(void) {
|
|
#ifdef DUSK_TIME_DYNAMIC
|
|
if(TIME.dynamicUpdate) {
|
|
errorOk();
|
|
}
|
|
#endif
|
|
|
|
// TODO: Do not update if the scene is not the map scene?
|
|
errorChain(mapUpdate());
|
|
|
|
// Update overworld ents.
|
|
entity_t *ent = &ENTITIES[0];
|
|
do {
|
|
if(ent->type == ENTITY_TYPE_NULL) continue;
|
|
entityUpdate(ent);
|
|
} while(++ent < &ENTITIES[ENTITY_COUNT]);
|
|
|
|
cutsceneSystemUpdate();
|
|
errorChain(rpgCameraUpdate());
|
|
errorOk();
|
|
}
|
|
|
|
errorret_t rpgDispose(void) {
|
|
cutsceneSystemDispose();
|
|
errorChain(mapDispose());
|
|
|
|
errorOk();
|
|
} |