From b275caf7956a72a64b8c8bf238831ebe8226f62e Mon Sep 17 00:00:00 2001 From: En Yi Date: Mon, 23 Sep 2024 21:55:06 +0800 Subject: [PATCH] Add spawning urchin in editor --- scenes/editor_scene.c | 53 +++++++++++++++++++++++++++++++++++++++++-- scenes/items_ent.c | 2 +- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index e73b461..224199a 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -1,3 +1,4 @@ +#include "EC.h" #include "scene_impl.h" #include "game_systems.h" #include "water_flow.h" @@ -28,13 +29,20 @@ enum EntitySpawnSelection { SPAWN_BOULDER, SPAWN_WATER_RUNNER, SPAWN_LEVEL_END, + SPAWN_URCHIN, }; -#define MAX_SPAWN_TYPE 16 +#define MAX_SPAWN_TYPE 17 static unsigned int current_spawn_selection = 0; static bool metal_toggle = false; static bool crate_activation = false; +#define MAX_URCHIN_SPAWN_SPD 20 +#define URCHIN_SPAWN_UI_RADIUS 40 +#define URCHIN_VELOCITY_SCALE 10 +static Vector2 urchin_spawn_vec = {0,0}; + + #define SELECTION_TILE_SIZE 32 #define SELECTION_TILE_HALFSIZE (SELECTION_TILE_SIZE >> 1) #define SELECTION_GAP 5 @@ -77,6 +85,7 @@ static char* get_spawn_selection_string(enum EntitySpawnSelection sel) case SPAWN_BOULDER: return "boulder"; case SPAWN_WATER_RUNNER: return "water runner"; case SPAWN_LEVEL_END: return "level end"; + case SPAWN_URCHIN: return "urchin"; default: return "unknown"; } } @@ -134,6 +143,31 @@ static void level_scene_render_func(Scene_t* scene) sprintf(buffer, "Camera mode: %s", data->camera.mode == CAMERA_FOLLOW_PLAYER ? "FOLLOW" : "FREE"); DrawText(buffer, draw_pos.x, draw_pos.y, 20, BLACK); + draw_pos.x = game_rec.x + game_rec.width - 50 - URCHIN_SPAWN_UI_RADIUS; + draw_pos.y = game_rec.y + game_rec.height + SELECTION_GAP + URCHIN_SPAWN_UI_RADIUS; + + // Draw Urchin spawn info + DrawCircleV(draw_pos, 40, RED); + // HACK: because this ui is not stored, need to perform the mouse check here + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) + { + Vector2 click_pos = Vector2Subtract( + scene->mouse_pos, draw_pos + ); + float mag = Vector2Length(click_pos); + if (mag <= URCHIN_SPAWN_UI_RADIUS) + { + urchin_spawn_vec = Vector2Scale( + Vector2Normalize(click_pos), + mag + ); + } + } + DrawCircleV( + Vector2Add(urchin_spawn_vec, draw_pos), + 4, BLUE + ); + // For DEBUG const int gui_x = game_rec.x + game_rec.width + 10; int gui_y = 15; @@ -746,7 +780,19 @@ static void toggle_block_system(Scene_t* scene, ActionType_t action, bool presse if (p_ent != NULL) { p_ent->position.x = (tile_idx % tilemap.width) * tilemap.tile_size + (tilemap.tile_size >> 1); - p_ent->position.y = (tile_idx / tilemap.width) * tilemap.tile_size + (tilemap.tile_size >> 1);; + p_ent->position.y = (tile_idx / tilemap.width) * tilemap.tile_size + (tilemap.tile_size >> 1); + } + } + break; + case SPAWN_URCHIN: + { + Entity_t* p_ent = create_urchin(&scene->ent_manager); + if (p_ent != NULL) + { + p_ent->position.x = (tile_idx % tilemap.width) * tilemap.tile_size + (tilemap.tile_size >> 1); + p_ent->position.y = (tile_idx / tilemap.width) * tilemap.tile_size + (tilemap.tile_size >> 1); + CTransform_t* p_ct = get_component(p_ent, CTRANSFORM_COMP_T); + p_ct->velocity = Vector2Scale(urchin_spawn_vec, URCHIN_VELOCITY_SCALE); } } break; @@ -1392,6 +1438,9 @@ void init_sandbox_scene(LevelScene_t* scene) case SPAWN_LEVEL_END: DrawCircleV(Vector2Add(draw_pos, half_size), half_size.x, GREEN); break; + case SPAWN_URCHIN: + DrawCircleV(Vector2Add(draw_pos, half_size), half_size.x, RED); + break; } draw_pos.x += SELECTION_TILE_SIZE; diff --git a/scenes/items_ent.c b/scenes/items_ent.c index 43bceef..3be7e90 100644 --- a/scenes/items_ent.c +++ b/scenes/items_ent.c @@ -267,7 +267,7 @@ Entity_t* create_urchin(EntityManager_t* ent_manager) CHitBoxes_t* p_hitbox = add_component(p_urchin, CHITBOXES_T); p_hitbox->n_boxes = 1; p_hitbox->boxes[0] = (Rectangle){3, 3, 26, 26}; - p_hitbox->atk = 3; + p_hitbox->atk = 2; CSprite_t* p_cspr = add_component(p_urchin, CSPRITE_T); p_cspr->sprites = item_sprite_map;