Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add destroy_grid_entity function #341

Merged
merged 4 commits into from
Oct 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions docs/game_data/spel2.lua

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions docs/src/includes/_globals.md
Original file line number Diff line number Diff line change
Expand Up @@ -1204,6 +1204,18 @@ Depending on the image size, this can take a moment, preferably don't create the
Create image from file, cropped to the geometry provided. Returns a tuple containing id, width and height.
Depending on the image size, this can take a moment, preferably don't create them dynamically, rather create all you need in global scope so it will load them as soon as the game starts

### destroy_grid


> Search script examples for [destroy_grid](https://github.com/spelunky-fyi/overlunky/search?l=Lua&q=destroy_grid)

#### nil destroy_grid(int uid)

#### nil destroy_grid(float x, float y, [LAYER](#LAYER) layer)

Destroy the grid entity (by uid or position), and its item entities, removing them from the grid without dropping particles or gold.
Will also destroy monsters or items that are standing on a linked activefloor or chain, though excludes [MASK](#MASK).PLAYER to prevent crashes

### disable_floor_embeds


Expand Down
32 changes: 32 additions & 0 deletions src/game_api/layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,3 +215,35 @@ void Layer::move_grid_entity(Entity* ent, uint32_t x, uint32_t y, Layer* dest_la
}
}
}

void Layer::destroy_grid_entity(Entity* ent)
{
if (ent)
{
auto items = ent->items.entities();
for (auto ptr = items.cend(); ptr != items.cbegin();)
{
ptr--;
Entity* item_ent = *ptr;
if (!item_ent->is_player()) // if not player
{
destroy_grid_entity(item_ent);
}
}

const auto pos = ent->position();
const uint32_t current_grid_x = static_cast<uint32_t>(std::round(pos.first));
const uint32_t current_grid_y = static_cast<uint32_t>(std::round(pos.second));
if (current_grid_x < g_level_max_x && current_grid_y < g_level_max_y)
{
if (grid_entities[current_grid_y][current_grid_x] == ent)
{
grid_entities[current_grid_y][current_grid_x] = nullptr;
update_liquid_collision_at(pos.first, pos.second, false);
Dregu marked this conversation as resolved.
Show resolved Hide resolved
}
}

ent->flags |= 1U << (29 - 1); // set DEAD flag to prevent certain stuff like gold nuggets drop or particles from entities such as spikes
ent->destroy();
}
}
2 changes: 2 additions & 0 deletions src/game_api/layer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -210,4 +210,6 @@ struct Layer

void move_grid_entity(Entity* ent, float x, float y, Layer* dest_layer);
void move_grid_entity(Entity* ent, uint32_t x, uint32_t y, Layer* dest_layer);

void destroy_grid_entity(Entity* ent);
};
20 changes: 20 additions & 0 deletions src/game_api/rpc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1673,6 +1673,26 @@ void move_grid_entity(int32_t uid, float x, float y, LAYER layer)
}
}

void destroy_grid(int32_t uid)
{
if (auto entity = get_entity_ptr(uid))
{
auto state = State::get();
state.layer(entity->layer)->destroy_grid_entity(entity);
}
}

void destroy_grid(float x, float y, LAYER layer)
{
auto state = State::get();
uint8_t actual_layer = enum_to_layer(layer);

if (Entity* entity = state.layer(actual_layer)->get_grid_entity_at(x, y))
{
state.layer(entity->layer)->destroy_grid_entity(entity);
}
}

void add_item_to_shop(int32_t item_uid, int32_t shop_owner_uid)
{
Movable* item = get_entity_ptr(item_uid)->as<Movable>();
Expand Down
2 changes: 2 additions & 0 deletions src/game_api/rpc.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ void change_waddler_drop(std::vector<ENT_TYPE> ent_types);
void poison_entity(int32_t entity_uid);
void modify_ankh_health_gain(uint8_t max_health, uint8_t beat_add_health);
void move_grid_entity(int32_t uid, float x, float y, LAYER layer);
void destroy_grid(int32_t uid);
void destroy_grid(float x, float y, LAYER layer);
void add_item_to_shop(int32_t item_uid, int32_t shop_owner_uid);
void change_poison_timer(int16_t frames);
void set_adventure_seed(int64_t first, int64_t second);
Expand Down
6 changes: 6 additions & 0 deletions src/game_api/script/lua_vm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -966,6 +966,12 @@ end
lua["move_entity"] = move_entity_abs;
/// Teleport grid entity, the destination should be whole number, this ensures that the collisions will work properly
lua["move_grid_entity"] = move_grid_entity;
auto destroy_grid = sol::overload(
static_cast<void (*)(int32_t uid)>(::destroy_grid),
static_cast<void (*)(float x, float y, LAYER layer)>(::destroy_grid));
/// Destroy the grid entity (by uid or position), and its item entities, removing them from the grid without dropping particles or gold.
/// Will also destroy monsters or items that are standing on a linked activefloor or chain, though excludes MASK.PLAYER to prevent crashes
lua["destroy_grid"] = destroy_grid;
/// Make an ENT_TYPE.FLOOR_DOOR_EXIT go to world `w`, level `l`, theme `t`
lua["set_door_target"] = set_door_target;
/// Short for [set_door_target](#set_door_target).
Expand Down
Loading