Nimbin[12]?SDL & Graphics / mapcreator / src/inventory/weapon.cpp

mapcreator git · master

SDL3 2.5D game and engine using assets, with map editor

sdl3 c++ game engine map-editor cmake · first commit 2025-10-31 · last commit 2026-09-07 (1 month ago) · synced 3 days ago · upstream: git.ide3.de/hsnr/sdl-spieleentwicklung/map_creator

C++ 99.3%
git clone https://git.christianimmanuel.de/sdl-graphics/mapcreator.gitwget https://git.christianimmanuel.de/sdl-graphics/mapcreator/archive/mapcreator.tar.gz
src/inventory/weapon.cpp 2.1 KB · 71 lines raw
#include "inventory/weapon.hpp"

#include <iostream>

std::vector<WeaponTileSet> weapon_sets;
std::vector<WeaponSet>     weapons;


Weapon::Weapon(WeaponType wtype, WeaponMaterial wmaterial) : type(wtype), material(wmaterial) {
    for (size_t i = 0; i < weapons.size(); i++) {
        const auto& w = weapons[i];
        const auto& tileset = weapon_sets[w.weapon_tileset_id];

        if (w.type == wtype && tileset.material == wmaterial) {
            weapon_index = i;
            return;
        }
    }
    weapon_index = (size_t)-1; // not found
}

void
Weapon::AddWeaponFromTileset(size_t tileset_id, WeaponType type,
                    float demage, float speed, float x, float y, float w, float h) {
    weapons.push_back({
        tileset_id,
        SDL_FRect{x, y, w, h},
        type,
        demage,
        speed,
    });
}


void
Weapon::Init(SDL_Renderer* renderer) {
    // Add the wood tileset
    weapon_sets.push_back({
        IMG_LoadTexture(renderer, "Pixel_Crawler/Weapons/Wood/Wood.png"),
        {12, 7},                 // size in tiles
        WeaponMaterial::WOOD
    });

    // Generate weapons from the tileset grid
    AddWeaponFromTileset(0, WeaponType::LONGSWORD, 10, 1,  0,   0,  16, 48);
    AddWeaponFromTileset(0, WeaponType::HAMMER,    10, 1, 16,  16,  16, 32);
    AddWeaponFromTileset(0, WeaponType::SWORD,     10, 1, 32,  16,  16, 32);
    AddWeaponFromTileset(0, WeaponType::SPEER,     10, 1, 48,   0,  16, 48);
}


void
Weapon::Draw(SDL_Renderer* renderer, float x, float y) {
    if (weapon_index >= weapons.size()) return;

    const WeaponSet& weaponset = weapons[weapon_index];
    const WeaponTileSet& tileset = weapon_sets[weaponset.weapon_tileset_id];

    SDL_FRect dest;
    float offset = 20;
    if (!flip)
        offset = 19;
    dest.x = Scale(x + offset);
    dest.y = Scale(y + 15);
    dest.w = Scale(static_cast<int>(weaponset.tileset_position.w));
    dest.h = Scale(static_cast<int>(weaponset.tileset_position.h));

    SDL_RenderTextureRotated(renderer, tileset.texture, &weaponset.tileset_position, &dest,
            0.0, nullptr,
            flip ? SDL_FLIP_NONE : SDL_FLIP_HORIZONTAL);
}