#include "utils.h" // Pretty much any object in the game. #ifndef ENTITY_H #define ENTITY_H #define ENTITY_COUNT 14 #define TREE_SCALE 40.0 #define BUSH_SCALE 3.0 #define FLOWER_SCALE 3.0 #define POND_SIZE 250.0 #define POND_HEIGHT 15.0 #define UTILITY_POLE_HEIGHT 100.0 #define UTILITY_POLE_RADIUS 3.0 #define SAMANTHA_WIDTH (2.65966 / 2.0) #define SAMANTHA_HEIGHT (3.21054 / 2.0) #define SAMANTHA_THICKNESS (1.46845 / 2.0) #define SAMANTHA_STATIC_SPEED 24 #define SAMANTHA_STATIC_FRAMES 4 #define SAMANTHAS_SPOT_SIZE 10 #define SAMANTHAS_SPOT_HEIGHT 5 #define TRASHCAN_SCALE 2.0 #define TRASHCAN_FRAMES 4 #define TRASHCAN_ANIMATION_SPEED 6 #define TRASHCAN_WIDTH 45.0 #define TRASHCAN_HEIGHT 60.0 #define TRASH_SCALE 2.0 #define MEDICAL_TRASH_SCALE 2.0 #define SHOPKEEPER_WIDTH (2.04211 / 2.0) #define SHOPKEEPER_HEIGHT (2.59521 / 2.0) #define SHOPKEEPER_THICKNESS (0.493349 / 2.0) #define INTERACTION_MENU_MAX 9 #define INTERACTION_LABEL_MAX 64 #define ENTITY_DEFAULT_STATE -1 typedef int8_t EntityId; typedef int16_t EntityState; typedef struct Entity Entity; typedef void (*InteractionCallback)(Entity* entity, Game* game); typedef void (*InitEntityCallback)(Entity* entity); typedef void (*UpdateEntityCallback)(Entity* entity, Game* game); typedef void (*CloseEntityCallback)(Entity* entity); enum { ENTITY_NONE = -1, OLD_MINT, STICKY_NICKEL, TREE, BUSH, FLOWER, POND, UTILITY_POLE, SAMANTHA, SAMANTHAS_SPOT, TRASHCAN, TRASH, MEDICAL_TRASH, JOHN, RON }; typedef enum { INTERACTION_TALK, INTERACTION_SHOW_MENU, INTERACTION_END } InteractionCommand; typedef enum { SELECTION_INTERACT, SELECTION_NEXT_MESSAGE, SELECTION_MENU_ITEM, // +x to select any given menu entry SELECTION_LEAVE } Selection; struct Entity { EntityId id; Vector3 position; // Shouldnt be changed directly. BoundingBox box; EntityState state; void* data; }; typedef struct { InitEntityCallback initCallback; UpdateEntityCallback updateCallback; CloseEntityCallback closeCallback; bool isPlace; bool canBeSelected; } EntityEntry; typedef struct { char label[INTERACTION_LABEL_MAX]; InteractionCallback callback; } InteractionMenuEntry; extern const EntityEntry entityEntries[ENTITY_COUNT]; Entity createEntity(EntityId id, Vector3 position); void updateEntity(Entity* entity, Game* game); void setEntityPosition(Entity* entity, Vector3 position); void placeEntityOnGround(Entity* entity, const World* world); bool entityCanBeSelected(EntityId id); InteractionCommand interactWithEntity(Entity* entity, Game* game, Selection selection); BoundingBox entityBoxFromScale(float scale, float width, float height); #endif