aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/entities/oldMint.c23
-rw-r--r--src/entities/oldMint.h2
-rw-r--r--src/entities/stickyNickel.c24
-rw-r--r--src/entities/stickyNickel.h2
-rw-r--r--src/entity.c4
-rw-r--r--src/entity.h10
-rw-r--r--src/game.c4
-rw-r--r--src/player.c2
-rw-r--r--src/settings.c5
-rw-r--r--src/settings.h7
-rw-r--r--src/ui.c68
-rw-r--r--src/ui.h19
-rw-r--r--src/world.c59
-rw-r--r--src/world.h4
14 files changed, 184 insertions, 49 deletions
diff --git a/src/entities/oldMint.c b/src/entities/oldMint.c
index 17c751e..be90ed6 100644
--- a/src/entities/oldMint.c
+++ b/src/entities/oldMint.c
@@ -10,3 +10,26 @@ void updateOldMint(Entity* entity, Game* game)
DrawBillboard(game->player.camera, game->assets.textures[MINT_TEXTURE],
entity->position, 1.0, WHITE);
}
+
+InteractionCommand interactWithOldMint(Entity* entity, Game* game,
+ Selection selection)
+{
+ InventoryItem item = (InventoryItem){
+ .id = OLD_MINT,
+ .textureId = MINT_TEXTURE,
+ .count = 1
+ };
+
+ switch (selection)
+ {
+ case SELECTION_INTERACT:
+ setInteractionChat(
+ &game->interactionChat,
+ "Oh goodie it's an old mint!\nThough I advice you don't taste it\n...(assuming you want to live)");
+ addItemToInventory(&game->inventory, item);
+ return INTERACTION_TALK;
+ default:
+ entity->id = ENTITY_NONE;
+ return INTERACTION_END;
+ }
+}
diff --git a/src/entities/oldMint.h b/src/entities/oldMint.h
index 433b4a6..fa4ce9f 100644
--- a/src/entities/oldMint.h
+++ b/src/entities/oldMint.h
@@ -9,5 +9,7 @@
void initOldMint(Entity* entity);
void updateOldMint(Entity* entity, Game* game);
+InteractionCommand interactWithOldMint(Entity* entity, Game* game,
+ Selection selection);
#endif
diff --git a/src/entities/stickyNickel.c b/src/entities/stickyNickel.c
index 94755c5..87d3687 100644
--- a/src/entities/stickyNickel.c
+++ b/src/entities/stickyNickel.c
@@ -1,4 +1,5 @@
#include "stickyNickel.h"
+#include "ui.h"
void initStickyNickel(Entity* entity)
{
@@ -11,3 +12,26 @@ void updateStickyNickel(Entity* entity, Game* game)
DrawBillboard(game->player.camera, game->assets.textures[NICKEL_TEXTURE],
entity->position, 1.0, WHITE);
}
+
+InteractionCommand interactWithStickyNickel(Entity* entity, Game* game,
+ Selection selection)
+{
+ InventoryItem item = (InventoryItem){
+ .id = STICKY_NICKEL,
+ .textureId = NICKEL_TEXTURE,
+ .count = 1
+ };
+
+ switch (selection)
+ {
+ case SELECTION_INTERACT:
+ setInteractionChat(
+ &game->interactionChat,
+ "Luck you, its a sticky nickel :D\nBetter wash your hands...");
+ addItemToInventory(&game->inventory, item);
+ return INTERACTION_TALK;
+ default:
+ entity->id = ENTITY_NONE;
+ return INTERACTION_END;
+ }
+}
diff --git a/src/entities/stickyNickel.h b/src/entities/stickyNickel.h
index b7c938e..f291825 100644
--- a/src/entities/stickyNickel.h
+++ b/src/entities/stickyNickel.h
@@ -9,5 +9,7 @@
void initStickyNickel(Entity* entity);
void updateStickyNickel(Entity* entity, Game* game);
+InteractionCommand interactWithStickyNickel(Entity* entity, Game* game,
+ Selection selection);
#endif
diff --git a/src/entity.c b/src/entity.c
index c295289..2565d3b 100644
--- a/src/entity.c
+++ b/src/entity.c
@@ -8,7 +8,7 @@ const EntityEntry entityEntries[ENTITY_COUNT] = {
.initCallback = initOldMint,
.updateCallback = updateOldMint,
.closeCallback = NULL,
- .interactionCallback = NULL,
+ .interactionCallback = interactWithOldMint,
.isPlace = false,
.isBuilding = false,
.canBeSelected = true
@@ -18,7 +18,7 @@ const EntityEntry entityEntries[ENTITY_COUNT] = {
.initCallback = initStickyNickel,
.updateCallback = updateStickyNickel,
.closeCallback = NULL,
- .interactionCallback = NULL,
+ .interactionCallback = interactWithStickyNickel,
.isPlace = false,
.isBuilding = false,
.canBeSelected = true
diff --git a/src/entity.h b/src/entity.h
index b7c458e..45036d4 100644
--- a/src/entity.h
+++ b/src/entity.h
@@ -24,11 +24,11 @@ typedef enum Selection Selection;
typedef struct Entity Entity;
-typedef InteractionCommand (*InteractionCallback)(Entity* entity, Game* game,
- Selection selection);
typedef void (*InitEntityCallback)(Entity* entity);
typedef void (*UpdateEntityCallback)(Entity* entity, Game* game);
typedef void (*CloseEntityCallback)(Entity* entity);
+typedef InteractionCommand (*InteractionCallback)(Entity* entity, Game* game,
+ Selection selection);
enum {
ENTITY_NONE = -1,
@@ -72,12 +72,6 @@ struct Entity {
void* data;
};
-typedef struct {
- EntityId id;
- AssetId texture;
- int count;
-} EntityItem;
-
// Cubemap based building.
typedef struct {
Model model;
diff --git a/src/game.c b/src/game.c
index 06ce527..32a2153 100644
--- a/src/game.c
+++ b/src/game.c
@@ -96,7 +96,7 @@ void initGame(Game* game)
initInteractionMenu(&game->interactionMenu, &game->settings);
// Inventory.
- initInventory(&game->inventory);
+ initInventory(&game->inventory, &game->settings);
disableGameCursor(game);
}
@@ -327,7 +327,7 @@ void updateGameScene(Game* game)
updateGameStatus(game);
updateInteractionChat(&game->interactionChat, game);
updateInteractionMenu(&game->interactionMenu, game);
- updateInventory(&game->inventory);
+ updateInventory(&game->inventory, game);
}
void handleGameResize(Game* game)
diff --git a/src/player.c b/src/player.c
index ed3fd10..3720762 100644
--- a/src/player.c
+++ b/src/player.c
@@ -433,7 +433,7 @@ void playerUpdateSelectedEntity(Player* player, WorldUID uid, Game* game)
int keyPressed = GetKeyPressed();
// Handle key presses.
- if (IsKeyPressed(game->settings.interactKey))
+ if (IsKeyPressed(game->settings.interactKey) && !player->isInteracting)
{
playerInteractWithEntity(player, uid, game, SELECTION_INTERACT);
}
diff --git a/src/settings.c b/src/settings.c
index ee126b4..14b9257 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -38,9 +38,9 @@ Settings defaultSettings()
.mapZoomSpeed = 0.2,
.entityInfoFontSize = 20,
.statusAndInfoAlpha = (unsigned char)255.0 * 0.8,
+ .uiAlpha = (unsigned char)255.0 * 0.9,
+ .uiOutlineSize = 2.0,
.interactionFontSize = 20,
- .interactionAlpha = (unsigned char)255.0 * 0.9,
- .interactionOutlineSize = 2.0,
.interactionChatHeight = 300.0,
.interactionMenuWidth = 500.0,
.interactionChatAnimationSpeed = 0.03,
@@ -54,6 +54,7 @@ Settings defaultSettings()
.toggleCrossHairKey = KEY_C,
.toggleFPSKey = KEY_F,
.toggleMapPreviewKey = KEY_P,
+ .toggleInventoryKey = KEY_TAB,
.defaultMapZoomKey = KEY_Z,
.interactKey = KEY_E,
.nextMessageKey = KEY_ENTER,
diff --git a/src/settings.h b/src/settings.h
index b64c631..5d1b9c1 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -59,10 +59,10 @@ typedef struct {
int entityInfoFontSize;
unsigned char statusAndInfoAlpha;
- // Interaction chat and menu.
+ // Interaction chat and menu, and also UI.
+ unsigned char uiAlpha;
+ float uiOutlineSize;
int interactionFontSize;
- unsigned char interactionAlpha;
- float interactionOutlineSize;
float interactionChatHeight;
float interactionMenuWidth;
float interactionChatAnimationSpeed;
@@ -78,6 +78,7 @@ typedef struct {
KeyboardKey toggleCrossHairKey;
KeyboardKey toggleFPSKey;
KeyboardKey toggleMapPreviewKey;
+ KeyboardKey toggleInventoryKey;
KeyboardKey defaultMapZoomKey;
KeyboardKey interactKey;
KeyboardKey nextMessageKey;
diff --git a/src/ui.c b/src/ui.c
index ac176b8..089b9d2 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -83,10 +83,10 @@ void updateInteractionChat(InteractionChat* chat, Game* game)
}
Color background = DARKGRAY;
- background.a = game->settings.interactionAlpha;
+ background.a = game->settings.uiAlpha;
DrawRectangleRec(chat->rect, background);
- float lineThickness = game->settings.interactionOutlineSize;
+ float lineThickness = game->settings.uiOutlineSize;
float border = lineThickness + 1.0;
int fontSize = game->settings.interactionFontSize;
@@ -134,7 +134,7 @@ void resizeInteractionMenu(InteractionMenu* menu, const Settings* settings)
settings->interactionFontSize;
menu->rect.x = 0.0;
menu->rect.y = GetRenderHeight() - settings->interactionChatHeight -
- menu->rect.height - settings->interactionOutlineSize;
+ menu->rect.height - settings->uiOutlineSize;
}
void initInteractionMenu(InteractionMenu* menu, const Settings* settings)
@@ -198,10 +198,10 @@ void updateInteractionMenu(InteractionMenu* menu, Game* game)
// Draw background.
Color background = DARKGRAY;
- background.a = game->settings.interactionAlpha;
+ background.a = game->settings.uiAlpha;
DrawRectangleRec(menu->rect, background);
- float lineThickness = game->settings.interactionOutlineSize;
+ float lineThickness = game->settings.uiOutlineSize;
float border = lineThickness + 1.0;
int fontSize = game->settings.interactionFontSize;
@@ -228,19 +228,20 @@ void updateInteractionMenu(InteractionMenu* menu, Game* game)
}
}
-void resizeInventory(Inventory* inventory)
+void resizeInventory(Inventory* inventory, const Settings* settings)
{
- inventory->rect.width = 300.0;
- inventory->rect.height = 300.0;
+ float outlineThickness = settings->uiOutlineSize * 2.0;
+ float spriteSize = INVENTORY_SPRITE_SIZE * INVENTORY_SCALE;
+ inventory->rect.width = INVENTORY_COLUMNS * spriteSize + outlineThickness;
+ inventory->rect.height = INVENTORY_ROWS * spriteSize + outlineThickness;
inventory->rect.x = GetRenderWidth() / 2.0 - inventory->rect.width / 2.0;
inventory->rect.y = GetRenderHeight() / 2.0 - inventory->rect.height / 2.0;
}
-
-void initInventory(Inventory* inventory)
+void initInventory(Inventory* inventory, const Settings* settings)
{
- resizeInventory(inventory);
- inventory->visable = true;
- inventory->itemCount = 40;
+ resizeInventory(inventory, settings);
+ inventory->visable = false;
+ inventory->itemCount = 0;
}
void showInventory(Inventory* inventory)
@@ -253,7 +254,7 @@ void hideInventory(Inventory* inventory)
inventory->visable = false;
}
-void addItemToInventory(Inventory* inventory, EntityItem item)
+void addItemToInventory(Inventory* inventory, InventoryItem item)
{
// If item is already in the inventory.
for (int index = 0; index < inventory->itemCount; ++index)
@@ -277,11 +278,17 @@ void addItemToInventory(Inventory* inventory, EntityItem item)
}
}
-void updateInventory(Inventory* inventory)
+void updateInventory(Inventory* inventory, Game* game)
{
if (IsWindowResized())
{
- resizeInventory(inventory);
+ resizeInventory(inventory, &game->settings);
+ }
+
+ // Handle toggle key.
+ if (IsKeyPressed(game->settings.toggleInventoryKey))
+ {
+ inventory->visable = !inventory->visable;
}
if (!inventory->visable)
@@ -290,30 +297,41 @@ void updateInventory(Inventory* inventory)
}
// Draw background.
- int outlineThickness = 3;
- DrawRectangleRec(inventory->rect, PINK);
+ float outlineThickness = game->settings.uiOutlineSize;
+ Color backgroundColor = PINK;
+ backgroundColor.a = game->settings.uiAlpha;
+ DrawRectangleRec(inventory->rect, backgroundColor);
DrawRectangleLinesEx(inventory->rect, outlineThickness, BLACK);
// Draw items.
+ float spriteSize = INVENTORY_SPRITE_SIZE * INVENTORY_SCALE;
int startX = inventory->rect.x + outlineThickness;
int startY = inventory->rect.y + outlineThickness;
- int maxX = inventory->rect.width + inventory->rect.x - INVENTORY_SPRITE_SIZE;
- int maxY = inventory->rect.height + inventory->rect.y -
- INVENTORY_SPRITE_SIZE;
+ int maxX = inventory->rect.width + inventory->rect.x - spriteSize;
+ int maxY = inventory->rect.height + inventory->rect.y - spriteSize;
int x = startX;
int y = startY;
+ int fontSize = spriteSize / 3.0;
for (int index = 0; index < inventory->itemCount; ++index)
{
- DrawRectangle(x, y, INVENTORY_SPRITE_SIZE, INVENTORY_SPRITE_SIZE, GRAY);
- DrawText(TextFormat("%d\n", index), x, y, 16, BLACK);
+ InventoryItem* item = &inventory->items[index];
+
+ DrawTextureEx(game->assets.textures[item->textureId], (Vector2){x, y}, 0.0,
+ INVENTORY_SCALE, WHITE);
+
+ // Draw count.
+ if (item->count > 1)
+ {
+ DrawText(TextFormat("%d", item->count), x, y, fontSize, BLACK);
+ }
- x += INVENTORY_SPRITE_SIZE;
+ x += spriteSize;
if (x >= maxX)
{
x = startX;
- y += INVENTORY_SPRITE_SIZE;
+ y += spriteSize;
}
}
}
diff --git a/src/ui.h b/src/ui.h
index eee1d4f..14845d4 100644
--- a/src/ui.h
+++ b/src/ui.h
@@ -8,7 +8,10 @@
#define INTERACTION_COLUMN_MAX 80
#define INVENTORY_MAX 10
-#define INVENTORY_SPRITE_SIZE 42
+#define INVENTORY_SPRITE_SIZE 32
+#define INVENTORY_ROWS 8
+#define INVENTORY_COLUMNS 8
+#define INVENTORY_SCALE 2.0
typedef char InteractionItems[INTERACTION_MENU_MAX][INTERACTION_LABEL_MAX];
@@ -32,9 +35,15 @@ typedef struct {
} InteractionMenu;
typedef struct {
+ EntityId id;
+ AssetId textureId;
+ int count;
+} InventoryItem;
+
+typedef struct {
Rectangle rect;
bool visable;
- EntityItem items[INVENTORY_MAX];
+ InventoryItem items[INVENTORY_MAX];
int itemCount;
} Inventory;
@@ -60,10 +69,10 @@ void hideInteractionMenu(InteractionMenu* menu);
void updateInteractionMenu(InteractionMenu* menu, Game* game);
// Inventory
-void initInventory(Inventory* inventory);
+void initInventory(Inventory* inventory, const Settings* settings);
void showInventory(Inventory* inventory);
void hideInventory(Inventory* inventory);
-void addItemToInventory(Inventory* inventory, EntityItem item);
-void updateInventory(Inventory* inventory);
+void addItemToInventory(Inventory* inventory, InventoryItem item);
+void updateInventory(Inventory* inventory, Game* game);
#endif
diff --git a/src/world.c b/src/world.c
index 0096dbe..b53fb57 100644
--- a/src/world.c
+++ b/src/world.c
@@ -1065,7 +1065,7 @@ void castRayBVH(const World* world, BVHNode node, Ray ray, bool allowAll,
{
for (int index = 0; index < BVH_MAX; ++index)
{
- if (node.entities[index] != -1 &&
+ if (node.entities[index] != ENTITY_NONE &&
GetRayCollisionBox(
ray,
world->entities[node.entities[index]].box).hit)
@@ -1080,6 +1080,10 @@ void castRayBVH(const World* world, BVHNode node, Ray ray, bool allowAll,
{
continue;
}
+ else if (world->entities[node.entities[index]].id == ENTITY_NONE)
+ {
+ continue;
+ }
if (distance < *closestDistance)
{
@@ -1108,4 +1112,57 @@ WorldUID castRayAtWorld(const World* world, Ray ray, bool allowAll,
return uid;
}
+// This turned out to not be needed lol.
+WorldUID checkBoxCollisionBVH(const World* world, BVHNode node,
+ BoundingBox box, bool allowAll)
+{
+ if (!CheckCollisionBoxes(box, node.box))
+ {
+ return ENTITY_NONE;
+ }
+
+ // Leaf node.
+ if (node.branchCount == 0)
+ {
+ for (int index = 0; index < BVH_MAX; ++index)
+ {
+ if (node.entities[index] != ENTITY_NONE &&
+ CheckCollisionBoxes(
+ box,
+ world->entities[node.entities[index]].box))
+ {
+ // Don't include things that can't be selected.
+ if (!allowAll &&
+ !entityCanBeSelected(world->entities[node.entities[index]].id))
+ {
+ continue;
+ }
+
+ return node.entities[index];
+ }
+ }
+ }
+ else // Subtree.
+ {
+ for (int index = 0; index < node.branchCount; ++index)
+ {
+ WorldUID uid = checkBoxCollisionBVH(world, *node.branches[index], box,
+ allowAll);
+
+ if (uid != ENTITY_NONE)
+ {
+ return uid;
+ }
+ }
+ }
+
+ return ENTITY_NONE;
+}
+
+WorldUID checkBoxCollisionWithWorld(const World* world, BoundingBox box,
+ bool allowAll)
+{
+ return checkBoxCollisionBVH(world, world->bvh, box, allowAll);
+}
+
// Abortions are good. Get more abortions.
diff --git a/src/world.h b/src/world.h
index 2b51485..d714b29 100644
--- a/src/world.h
+++ b/src/world.h
@@ -91,7 +91,11 @@ void freeWorld(World world);
// When dealing with the world in 2d use y in place of z.
float getWorldHeightAtLocation(const World* world, float x, float y);
Vector2 worldPositionToPixel(const World* world, float x, float y);
+
+// "allowAll" allows non-selectable entities.
WorldUID castRayAtWorld(const World* world, Ray ray, bool allowAll,
int* tests);
+WorldUID checkBoxCollisionWithWorld(const World* world, BoundingBox box,
+ bool allowAll);
#endif