1
0
Fork 0
forked from NotAShelf/rogged

player: correct item pickup order to copy before marking picked_up

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: Ie226b4a0ae6566ca77ab49b7d22f36726a6a6964
This commit is contained in:
raf 2026-03-24 17:36:05 +03:00
commit c61e31f628
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF

View file

@ -19,7 +19,7 @@ void player_init(Player *p, int x, int y) {
// Initialize inventory to empty // Initialize inventory to empty
for (int i = 0; i < MAX_INVENTORY; i++) { for (int i = 0; i < MAX_INVENTORY; i++) {
p->inventory[i].picked_up = 1; // mark as invalid p->inventory[i].picked_up = 1; // mark as invalid
} }
} }
@ -43,8 +43,7 @@ static Item *get_item_at(Item *items, int count, int x, int y) {
return NULL; return NULL;
} }
int player_move(Player *p, int dx, int dy, Map *map, Enemy *enemies, int player_move(Player *p, int dx, int dy, Map *map, Enemy *enemies, int enemy_count, Item *items, int item_count) {
int enemy_count, Item *items, int item_count) {
int new_x = p->x + dx; int new_x = p->x + dx;
int new_y = p->y + dy; int new_y = p->y + dy;
@ -91,23 +90,26 @@ void player_attack(Player *p, Enemy *e) {
void player_pickup(Player *p, Item *i) { void player_pickup(Player *p, Item *i) {
if (p->inventory_count >= MAX_INVENTORY) { if (p->inventory_count >= MAX_INVENTORY) {
return; // inventory full return; // inventory full
} }
if (i->picked_up) { if (i->picked_up) {
return; // already picked up return; // already picked up
} }
i->picked_up = 1; // Copy item to inventory
p->inventory[p->inventory_count] = *i; // copy item to inventory p->inventory[p->inventory_count] = *i;
p->inventory_count++; p->inventory_count++;
// Mark original as picked up
i->picked_up = 1;
} }
void player_use_item(Player *p, Item *i) { void player_use_item(Player *p, Item *i) {
if (p == NULL || i == NULL) if (p == NULL || i == NULL)
return; return;
if (i->picked_up) if (i->picked_up)
return; // invalid item return; // invalid item
// Apply item effect // Apply item effect
item_use(p, i); item_use(p, i);
@ -149,6 +151,6 @@ Item *player_get_inventory_item(Player *p, int index) {
if (index < 0 || index >= MAX_INVENTORY) if (index < 0 || index >= MAX_INVENTORY)
return NULL; return NULL;
if (p->inventory[index].picked_up) if (p->inventory[index].picked_up)
return NULL; // invalid/empty return NULL; // invalid/empty
return &p->inventory[index]; return &p->inventory[index];
} }