variable tick rate support
parent
4cb85f069f
commit
339bb56dc7
|
@ -3,20 +3,20 @@
|
||||||
void PickItem(ecs_iter_t *it) {
|
void PickItem(ecs_iter_t *it) {
|
||||||
Position *p = ecs_field(it, Position, 2);
|
Position *p = ecs_field(it, Position, 2);
|
||||||
Inventory *inv = ecs_field(it, Inventory, 3);
|
Inventory *inv = ecs_field(it, Inventory, 3);
|
||||||
|
|
||||||
for (int i = 0; i < it->count; i++) {
|
for (int i = 0; i < it->count; i++) {
|
||||||
if (inv[i].pickup_time > game_time()) continue;
|
if (inv[i].pickup_time > game_time()) continue;
|
||||||
size_t ents_count;
|
size_t ents_count;
|
||||||
int64_t *ents = world_chunk_query_entities(it->entities[i], &ents_count, 2);
|
int64_t *ents = world_chunk_query_entities(it->entities[i], &ents_count, 2);
|
||||||
bool picked = false;
|
bool picked = false;
|
||||||
|
|
||||||
for (size_t j = 0; j < ents_count; j++) {
|
for (size_t j = 0; j < ents_count; j++) {
|
||||||
Item *drop = 0;
|
Item *drop = 0;
|
||||||
uint64_t ent_id = ents[j];
|
uint64_t ent_id = ents[j];
|
||||||
if ((drop = ecs_get_mut_if_ex(it->world, ent_id, Item))) {
|
if ((drop = ecs_get_mut_if_ex(it->world, ent_id, Item))) {
|
||||||
Position *p2 = ecs_get_mut_ex(it->world, ent_id, Position);
|
Position *p2 = ecs_get_mut_ex(it->world, ent_id, Position);
|
||||||
Velocity *v2 = ecs_get_mut_ex(it->world, ent_id, Velocity);
|
Velocity *v2 = ecs_get_mut_ex(it->world, ent_id, Velocity);
|
||||||
|
|
||||||
float dx = p2->x - p[i].x;
|
float dx = p2->x - p[i].x;
|
||||||
float dy = p2->y - p[i].y;
|
float dy = p2->y - p[i].y;
|
||||||
float range = zpl_sqrt(dx*dx + dy*dy);
|
float range = zpl_sqrt(dx*dx + dy*dy);
|
||||||
|
@ -33,7 +33,7 @@ void PickItem(ecs_iter_t *it) {
|
||||||
item->quantity += picked_count;
|
item->quantity += picked_count;
|
||||||
drop->quantity -= picked_count;
|
drop->quantity -= picked_count;
|
||||||
item->kind = drop->kind;
|
item->kind = drop->kind;
|
||||||
|
|
||||||
if (drop->quantity == 0)
|
if (drop->quantity == 0)
|
||||||
item_despawn(ent_id);
|
item_despawn(ent_id);
|
||||||
} else if (!world_entity_valid(item_slot_ent)) {
|
} else if (!world_entity_valid(item_slot_ent)) {
|
||||||
|
@ -50,7 +50,7 @@ void PickItem(ecs_iter_t *it) {
|
||||||
v2->y = (p[i].y - p2->y) * game_rules.item_attract_force;
|
v2->y = (p[i].y - p2->y) * game_rules.item_attract_force;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (picked) break;
|
if (picked) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,12 +60,12 @@ void DropItem(ecs_iter_t *it) {
|
||||||
Input *in = ecs_field(it, Input, 1);
|
Input *in = ecs_field(it, Input, 1);
|
||||||
Position *p = ecs_field(it, Position, 2);
|
Position *p = ecs_field(it, Position, 2);
|
||||||
Inventory *inv = ecs_field(it, Inventory, 3);
|
Inventory *inv = ecs_field(it, Inventory, 3);
|
||||||
|
|
||||||
for (int i = 0; i < it->count; i++) {
|
for (int i = 0; i < it->count; i++) {
|
||||||
if (!in[i].drop) continue;
|
if (!in[i].drop) continue;
|
||||||
|
|
||||||
ecs_entity_t *items = inv[i].items;
|
ecs_entity_t *items = inv[i].items;
|
||||||
|
|
||||||
if (in[i].storage_action){
|
if (in[i].storage_action){
|
||||||
if (world_entity_valid(in[i].storage_ent)){
|
if (world_entity_valid(in[i].storage_ent)){
|
||||||
ItemContainer *ic = 0;
|
ItemContainer *ic = 0;
|
||||||
|
@ -78,37 +78,37 @@ void DropItem(ecs_iter_t *it) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t slot_id = in[i].storage_action ? in[i].storage_selected_item : in[i].selected_item;
|
uint8_t slot_id = in[i].storage_action ? in[i].storage_selected_item : in[i].selected_item;
|
||||||
ecs_entity_t item_slot_ent = items[slot_id];
|
ecs_entity_t item_slot_ent = items[slot_id];
|
||||||
Item *item = item_get_data(item_slot_ent);
|
Item *item = item_get_data(item_slot_ent);
|
||||||
|
|
||||||
if (!item || item->quantity <= 0)
|
if (!item || item->quantity <= 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
uint32_t dropped_count = item->quantity;
|
uint32_t dropped_count = item->quantity;
|
||||||
if (in[i].sprint) {
|
if (in[i].sprint) {
|
||||||
dropped_count /= 2;
|
dropped_count /= 2;
|
||||||
} else if (in[i].ctrl) {
|
} else if (in[i].ctrl) {
|
||||||
dropped_count = item->quantity-1;
|
dropped_count = item->quantity-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dropped_count == 0)
|
if (dropped_count == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
item_show(item_slot_ent, true);
|
item_show(item_slot_ent, true);
|
||||||
|
|
||||||
Position *ipos = ecs_get_mut_ex(it->world, item_slot_ent, Position);
|
Position *ipos = ecs_get_mut_ex(it->world, item_slot_ent, Position);
|
||||||
entity_set_position(item_slot_ent, p[i].x, p[i].y);
|
entity_set_position(item_slot_ent, p[i].x, p[i].y);
|
||||||
|
|
||||||
Velocity *v = ecs_get_mut_ex(it->world, item_slot_ent, Velocity);
|
Velocity *v = ecs_get_mut_ex(it->world, item_slot_ent, Velocity);
|
||||||
v->x = in[i].mx * 800.0f;
|
v->x = in[i].mx * 800.0f;
|
||||||
v->y = in[i].my * 800.0f;
|
v->y = in[i].my * 800.0f;
|
||||||
|
|
||||||
inv[i].pickup_time = game_time() + game_rules.item_drop_pickup_time;
|
inv[i].pickup_time = game_time() + game_rules.item_drop_pickup_time;
|
||||||
in[i].drop = false;
|
in[i].drop = false;
|
||||||
items[slot_id] = 0;
|
items[slot_id] = 0;
|
||||||
|
|
||||||
if (item->quantity - dropped_count > 0) {
|
if (item->quantity - dropped_count > 0) {
|
||||||
item->quantity -= dropped_count;
|
item->quantity -= dropped_count;
|
||||||
ecs_entity_t te = item_spawn(item->kind, dropped_count);
|
ecs_entity_t te = item_spawn(item->kind, dropped_count);
|
||||||
|
@ -155,12 +155,12 @@ void DropItem(ecs_iter_t *it) {
|
||||||
void SwapItems(ecs_iter_t *it) {
|
void SwapItems(ecs_iter_t *it) {
|
||||||
Input *in = ecs_field(it, Input, 1);
|
Input *in = ecs_field(it, Input, 1);
|
||||||
Inventory *inv = ecs_field(it, Inventory, 2);
|
Inventory *inv = ecs_field(it, Inventory, 2);
|
||||||
|
|
||||||
for (int i = 0; i < it->count; i++) {
|
for (int i = 0; i < it->count; i++) {
|
||||||
if (!in[i].swap) continue;
|
if (!in[i].swap) continue;
|
||||||
|
|
||||||
ecs_entity_t *items = inv[i].items;
|
ecs_entity_t *items = inv[i].items;
|
||||||
|
|
||||||
if (in[i].storage_action){
|
if (in[i].storage_action){
|
||||||
if (world_entity_valid(in[i].storage_ent)){
|
if (world_entity_valid(in[i].storage_ent)){
|
||||||
ItemContainer *ic = 0;
|
ItemContainer *ic = 0;
|
||||||
|
@ -173,15 +173,15 @@ void SwapItems(ecs_iter_t *it) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ecs_entity_t *from_ent = 0;
|
ecs_entity_t *from_ent = 0;
|
||||||
ecs_entity_t *to_ent = 0;
|
ecs_entity_t *to_ent = 0;
|
||||||
Item *to = 0;
|
Item *to = 0;
|
||||||
Item *from = 0;
|
Item *from = 0;
|
||||||
|
|
||||||
if (in[i].swap_storage){
|
if (in[i].swap_storage){
|
||||||
in[i].swap_storage = false;
|
in[i].swap_storage = false;
|
||||||
|
|
||||||
if (in[i].storage_action){
|
if (in[i].storage_action){
|
||||||
from_ent = &inv[i].items[in[i].swap_from];
|
from_ent = &inv[i].items[in[i].swap_from];
|
||||||
to_ent = &items[in[i].swap_to];
|
to_ent = &items[in[i].swap_to];
|
||||||
|
@ -208,12 +208,12 @@ void SwapItems(ecs_iter_t *it) {
|
||||||
from = item_get_data(*from_ent);
|
from = item_get_data(*from_ent);
|
||||||
to = item_get_data(*to_ent);
|
to = item_get_data(*to_ent);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!from) continue;
|
if (!from) continue;
|
||||||
|
|
||||||
uint16_t to_id = to ? item_find(to->kind) : ASSET_EMPTY;
|
uint16_t to_id = to ? item_find(to->kind) : ASSET_EMPTY;
|
||||||
asset_id to_kind = to ? to->kind : ASSET_EMPTY;
|
asset_id to_kind = to ? to->kind : ASSET_EMPTY;
|
||||||
|
|
||||||
if (to_ent == from_ent) {
|
if (to_ent == from_ent) {
|
||||||
// NOTE(zaklaus): do nothing
|
// NOTE(zaklaus): do nothing
|
||||||
} else if (to_kind == from->kind && to->quantity > 0) {
|
} else if (to_kind == from->kind && to->quantity > 0) {
|
||||||
|
@ -226,7 +226,7 @@ void SwapItems(ecs_iter_t *it) {
|
||||||
swapped_count = zpl_clamp(swapped_count, 0, item_max_quantity(to_id) - to->quantity);
|
swapped_count = zpl_clamp(swapped_count, 0, item_max_quantity(to_id) - to->quantity);
|
||||||
to->quantity += swapped_count;
|
to->quantity += swapped_count;
|
||||||
from->quantity -= swapped_count;
|
from->quantity -= swapped_count;
|
||||||
|
|
||||||
if (from->quantity == 0) {
|
if (from->quantity == 0) {
|
||||||
item_despawn(*from_ent);
|
item_despawn(*from_ent);
|
||||||
*from_ent = 0;
|
*from_ent = 0;
|
||||||
|
@ -243,14 +243,14 @@ void SwapItems(ecs_iter_t *it) {
|
||||||
ecs_entity_t te = item_spawn(from->kind, split_count);
|
ecs_entity_t te = item_spawn(from->kind, split_count);
|
||||||
item_show(te, false);
|
item_show(te, false);
|
||||||
*to_ent = te;
|
*to_ent = te;
|
||||||
|
|
||||||
from->quantity -= split_count;
|
from->quantity -= split_count;
|
||||||
} else {
|
} else {
|
||||||
ecs_entity_t tmp = *to_ent;
|
ecs_entity_t tmp = *to_ent;
|
||||||
*to_ent = *from_ent;
|
*to_ent = *from_ent;
|
||||||
*from_ent = tmp;
|
*from_ent = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
in[i].swap = false;
|
in[i].swap = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -259,19 +259,19 @@ void UseItem(ecs_iter_t *it) {
|
||||||
Input *in = ecs_field(it, Input, 1);
|
Input *in = ecs_field(it, Input, 1);
|
||||||
Position *p = ecs_field(it, Position, 2);
|
Position *p = ecs_field(it, Position, 2);
|
||||||
Inventory *inv = ecs_field(it, Inventory, 3);
|
Inventory *inv = ecs_field(it, Inventory, 3);
|
||||||
|
|
||||||
for (int i = 0; i < it->count; i++) {
|
for (int i = 0; i < it->count; i++) {
|
||||||
if (!in[i].use && !in[i].num_placements) continue;
|
if (!in[i].use && !in[i].num_placements) continue;
|
||||||
|
|
||||||
if (in[i].storage_action){
|
if (in[i].storage_action){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ecs_entity_t item_ent = 0;
|
ecs_entity_t item_ent = 0;
|
||||||
Item *item = NULL;
|
Item *item = NULL;
|
||||||
uint16_t item_id = 0;
|
uint16_t item_id = 0;
|
||||||
item_usage usage = UKIND_DELETE;
|
item_usage usage = UKIND_DELETE;
|
||||||
|
|
||||||
if (!in[i].deletion_mode){
|
if (!in[i].deletion_mode){
|
||||||
item_ent = inv[i].items[in[i].selected_item];
|
item_ent = inv[i].items[in[i].selected_item];
|
||||||
item = item_get_data(item_ent);
|
item = item_get_data(item_ent);
|
||||||
|
@ -279,7 +279,7 @@ void UseItem(ecs_iter_t *it) {
|
||||||
usage = item_get_usage(item_id);
|
usage = item_get_usage(item_id);
|
||||||
if (!item || item->quantity <= 0) continue;
|
if (!item || item->quantity <= 0) continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!in[i].use && usage == UKIND_DELETE){
|
if (!in[i].use && usage == UKIND_DELETE){
|
||||||
for (size_t j = 0; j < in[i].num_placements; j++) {
|
for (size_t j = 0; j < in[i].num_placements; j++) {
|
||||||
world_chunk_destroy_block(in[i].placements_x[j], in[i].placements_y[j], true);
|
world_chunk_destroy_block(in[i].placements_x[j], in[i].placements_y[j], true);
|
||||||
|
@ -304,17 +304,17 @@ void UseItem(ecs_iter_t *it) {
|
||||||
// NOTE(zaklaus): ensure we pick the first variant
|
// NOTE(zaklaus): ensure we pick the first variant
|
||||||
ofs = 1;
|
ofs = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t j = 0; j < in[i].num_placements; j++) {
|
for (size_t j = 0; j < in[i].num_placements; j++) {
|
||||||
Position pos = {.x = in[i].placements_x[j], .y = in[i].placements_y[j]};
|
Position pos = {.x = in[i].placements_x[j], .y = in[i].placements_y[j]};
|
||||||
item_use(it->world, item_ent, item, pos, ofs);
|
item_use(it->world, item_ent, item, pos, ofs);
|
||||||
}
|
}
|
||||||
|
|
||||||
in[i].num_placements = 0;
|
in[i].num_placements = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
entity_wake(it->entities[i]);
|
entity_wake(it->entities[i]);
|
||||||
|
|
||||||
if (usage != UKIND_DELETE && item->quantity == 0) {
|
if (usage != UKIND_DELETE && item->quantity == 0) {
|
||||||
item_despawn(item_ent);
|
item_despawn(item_ent);
|
||||||
inv[i].items[in[i].selected_item] = 0;
|
inv[i].items[in[i].selected_item] = 0;
|
||||||
|
@ -324,10 +324,10 @@ void UseItem(ecs_iter_t *it) {
|
||||||
|
|
||||||
void InspectContainers(ecs_iter_t *it) {
|
void InspectContainers(ecs_iter_t *it) {
|
||||||
Input *in = ecs_field(it, Input, 1);
|
Input *in = ecs_field(it, Input, 1);
|
||||||
|
|
||||||
for (int i = 0; i < it->count; ++i) {
|
for (int i = 0; i < it->count; ++i) {
|
||||||
if (!in[i].pick) continue;
|
if (!in[i].pick) continue;
|
||||||
|
|
||||||
if ((in[i].sel_ent && ecs_get(it->world, in[i].sel_ent, ItemContainer)) || !in[i].sel_ent)
|
if ((in[i].sel_ent && ecs_get(it->world, in[i].sel_ent, ItemContainer)) || !in[i].sel_ent)
|
||||||
in[i].storage_ent = in[i].sel_ent;
|
in[i].storage_ent = in[i].sel_ent;
|
||||||
}
|
}
|
||||||
|
@ -336,19 +336,19 @@ void InspectContainers(ecs_iter_t *it) {
|
||||||
void HarvestIntoContainers(ecs_iter_t *it) {
|
void HarvestIntoContainers(ecs_iter_t *it) {
|
||||||
ItemContainer *in = ecs_field(it, ItemContainer, 1);
|
ItemContainer *in = ecs_field(it, ItemContainer, 1);
|
||||||
Position *p = ecs_field(it, Position, 2);
|
Position *p = ecs_field(it, Position, 2);
|
||||||
|
|
||||||
for (int i = 0; i < it->count; ++i) {
|
for (int i = 0; i < it->count; ++i) {
|
||||||
// NOTE(zaklaus): find any item
|
// NOTE(zaklaus): find any item
|
||||||
size_t ents_count;
|
size_t ents_count;
|
||||||
int64_t *ents = world_chunk_query_entities(it->entities[i], &ents_count, 0);
|
int64_t *ents = world_chunk_query_entities(it->entities[i], &ents_count, 0);
|
||||||
bool picked = false;
|
bool picked = false;
|
||||||
|
|
||||||
for (size_t j = 0; j < ents_count; j++) {
|
for (size_t j = 0; j < ents_count; j++) {
|
||||||
Item *drop = 0;
|
Item *drop = 0;
|
||||||
if ((drop = ecs_get_mut_if_ex(it->world, ents[j], Item))) {
|
if ((drop = ecs_get_mut_if_ex(it->world, ents[j], Item))) {
|
||||||
Position *p2 = ecs_get_mut_ex(it->world, ents[j], Position);
|
Position *p2 = ecs_get_mut_ex(it->world, ents[j], Position);
|
||||||
uint64_t ent_id = ents[j];
|
uint64_t ent_id = ents[j];
|
||||||
|
|
||||||
float dx = p2->x - p[i].x;
|
float dx = p2->x - p[i].x;
|
||||||
float dy = p2->y - p[i].y;
|
float dy = p2->y - p[i].y;
|
||||||
float range = zpl_sqrt(dx*dx + dy*dy);
|
float range = zpl_sqrt(dx*dx + dy*dy);
|
||||||
|
@ -364,7 +364,7 @@ void HarvestIntoContainers(ecs_iter_t *it) {
|
||||||
picked_count = zpl_clamp(picked_count, 0, item_max_quantity(drop_id) - item->quantity);
|
picked_count = zpl_clamp(picked_count, 0, item_max_quantity(drop_id) - item->quantity);
|
||||||
item->quantity += picked_count;
|
item->quantity += picked_count;
|
||||||
drop->quantity -= picked_count;
|
drop->quantity -= picked_count;
|
||||||
|
|
||||||
if (drop->quantity == 0) {
|
if (drop->quantity == 0) {
|
||||||
item_despawn(ent_id);
|
item_despawn(ent_id);
|
||||||
}
|
}
|
||||||
|
@ -388,13 +388,13 @@ void HarvestIntoContainers(ecs_iter_t *it) {
|
||||||
void ThrowItemsOut(ecs_iter_t *it) {
|
void ThrowItemsOut(ecs_iter_t *it) {
|
||||||
ItemContainer *storage = ecs_field(it, ItemContainer, 1);
|
ItemContainer *storage = ecs_field(it, ItemContainer, 1);
|
||||||
Position *p = ecs_field(it, Position, 2);
|
Position *p = ecs_field(it, Position, 2);
|
||||||
|
|
||||||
for (int i = 0; i < it->count; i++) {
|
for (int i = 0; i < it->count; i++) {
|
||||||
for (int j = 0; j < ITEMS_CONTAINER_SIZE; j++) {
|
for (int j = 0; j < ITEMS_CONTAINER_SIZE; j++) {
|
||||||
ecs_entity_t item_slot_ent = storage[i].items[j];
|
ecs_entity_t item_slot_ent = storage[i].items[j];
|
||||||
Item *item = item_get_data(item_slot_ent);
|
Item *item = item_get_data(item_slot_ent);
|
||||||
if (!item) continue;
|
if (!item) continue;
|
||||||
|
|
||||||
item_show(item_slot_ent, true);
|
item_show(item_slot_ent, true);
|
||||||
entity_set_position(item_slot_ent, p[i].x, p[i].y);
|
entity_set_position(item_slot_ent, p[i].x, p[i].y);
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ void IntegratePositions(ecs_iter_t *it) {
|
||||||
if (ecs_get(it->world, it->entities[i], IsInVehicle)) {
|
if (ecs_get(it->world, it->entities[i], IsInVehicle)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (zpl_abs(v[i].x) >= 0.001f || zpl_abs(v[i].y) >= 0.001f)
|
//if (zpl_abs(v[i].x) >= 0.0001f || zpl_abs(v[i].y) >= 0.0001f)
|
||||||
{
|
{
|
||||||
// NOTE(zaklaus): world bounds
|
// NOTE(zaklaus): world bounds
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue