]> code.bitgloo.com Git - clyne/gamedev.git/commitdiff
bow/arrow updates, food
authorClyne Sullivan <tullivan99@gmail.com>
Fri, 20 Oct 2017 14:30:53 +0000 (10:30 -0400)
committerClyne Sullivan <tullivan99@gmail.com>
Fri, 20 Oct 2017 14:30:53 +0000 (10:30 -0400)
config/items.xml
include/inventory.hpp
src/attack.cpp
src/inventory.cpp
src/player.cpp
src/ui_menu.cpp
xml/!town.xml
xml/entities.xml
xml/snow.xml

index 574dddae82162a1981a133c3f46fa4e84506846c..a70996a3495b84c3ad932e1f698a76d8b9f70981 100644 (file)
 <item name="Dank MayMay"    type="Tool"         value="10" maxStackSize="420" width="10" height="10" sprite="assets/items/ITEM_TEST.png" />
 <item name="Your Bag"       type="Equip"        value="32" maxStackSize="1"   width="5"  height="5"  sprite="assets/items/ITEM_TEST.png" />
 <item name="Flashlight"     type="Tool"         value="1"  maxStackSize="1"   width="4"  height="8"  sprite="assets/items/flashlight_off.png" />
-<item name="Fried Chicken"  type="Cooked Food"  value="10" maxStackSize="6" sprite="assets/items/FOOD_CHICKEN_FRIED.png" />
+<item name="Fried Chicken"  type="Food"  value="10" maxStackSize="6" sprite="assets/items/FOOD_CHICKEN_FRIED.png" />
 
 <!--###########-->
 <!-- NEW ITEMS -->
 <!--##########-->
 
 <!-- WEAPONS -->
-<item name="Wood Sword"     type="Sword"    damage="3"  maxStackSize="1"  sound="assets/sounds/longSwing.wav"  sprite="assets/items/SWORD_WOOD.png" cooldown="250">
-       <attack range="6, 2" power="1" effect="assets/effects/starAttack.gif">
+<item name="Wood Sword" type="Sword" maxStackSize="1" sound="assets/sounds/longSwing.wav" sprite="assets/items/SWORD_WOOD.png" cooldown="250">
+       <attack effect="assets/effects/starAttack.gif">
                i = 1
 
                effect = function()
@@ -27,7 +27,7 @@
                end
 
                hit = function()
-                       if (i &lt; 30) then
+                       if (i &lt; 80) then
                                xrange = i
                                i = i + 1
                        else
@@ -36,7 +36,7 @@
                end
        </attack>
 </item>
-<item name="Hunters Bow"    type="Bow"      damage="2"  maxStackSize="1"    sprite="assets/items/bow.png" cooldown="600">
+<item name="Hunters Bow" type="Bow" drawOffset="5,16" maxStackSize="1" sprite="assets/items/bow.png" cooldown="600">
        <attack effect="assets/effects/starAttack.gif">
                effect = function()
                        flash(255, 0, 255)
index f8581ccf9ea8cefc46d96ac135b049b1cab120ce..273241a191d274d66c9475b4585c2861e9a0882e 100644 (file)
@@ -33,6 +33,7 @@ struct Item {
        TextureIterator effect; /**< Animation played on item use */
        Mix_Chunk* sound;       /**< The sound to play on item use */
        int cooldown;
+       vec2 drawOffset;
 
        Item(void)
                : value(0), stackSize(1), cooldown(0) {}
index 16c7f8ab60395d34d4b56dc10f3e609cbcbfdefc..8c5d44a870ab861876b910a9912d5591d5c85e1b 100644 (file)
@@ -96,7 +96,8 @@ void AttackSystem::update(entityx::EntityManager& en, entityx::EventManager& ev,
                //point.y -= size.y / 2; // center range height
                
                vec2 point = a.pos + a.attack.offset;
-               vec2 size;
+               vec2 size (0, a.attack.range.y);
+               point.y -= size.y / 2;
                a.attack.script("hit", {LuaVariable("xrange", size.x)});
 
                en.each<Position, Solid, Health>(
index 0ed5dc7f3671b7f67911a9a6e5c6ecdb8fb5d9fc..947c7fc9bc02d9ffb518ba3172660cd0e771a0e2 100644 (file)
@@ -71,6 +71,8 @@ void InventorySystem::loadItems(void) {
                        item.sound = nullptr;
                item.cooldown = 250;
                itm->QueryIntAttribute("cooldown", &item.cooldown);
+               auto drawOffset = itm->StrAttribute("drawOffset");
+               item.drawOffset = drawOffset;
 
                auto atk = itm->FirstChildElement("attack");
                if (atk != nullptr) {
@@ -197,6 +199,7 @@ void InventorySystem::render(void)
 
                auto pos = PlayerSystem::getPosition();
                vec2 sta (pos.x, pos.y);
+               sta += i.item->drawOffset;
                vec2 end (sta + (i.item->sprite.getDim() * game::HLINE));
                GLfloat coords[] = {
                        sta.x, sta.y, -8, 0, 1,
@@ -219,17 +222,32 @@ void InventorySystem::render(void)
 bool InventorySystem::receive(const MouseClickEvent &mce)
 {
        if (mce.button == SDL_BUTTON_RIGHT) {
-               game::entities.each<ItemDrop>([&](entityx::Entity e, ItemDrop& id) {
-                       auto& posComp = *e.component<Position>();
-                       auto& dimComp = *e.component<Solid>();
-                       vec2 sta (posComp.x, posComp.y);
-                       vec2 end (sta.x + dimComp.width, sta.y + dimComp.height);
-
-                       if (mce.position > sta && mce.position < end) {
-                               add(id.item.item->name, id.item.count);
-                               e.destroy();
+               if ((mce.position > hotStart && mce.position < hotEnd) ||
+                       (fullInventory && mce.position > fullStart && mce.position < fullEnd)) {
+                       int end = fullInventory ? items.size() : hotbarSize;
+                       for (int i = 0; i < end; i++) {
+                               if (!isGoodEntry(items[i]))
+                                       continue;
+
+                               if (mce.position > items[i].loc && mce.position < items[i].loc + entrySize) {
+                                       if (items[i].item->type == "Food")
+                                               game::events.emit<UseItemEvent>(mce.position, items[i].item);
+                                       break;
+                               }
                        }
-               });
+               } else {
+                       game::entities.each<ItemDrop>([&](entityx::Entity e, ItemDrop& id) {
+                               auto& posComp = *e.component<Position>();
+                               auto& dimComp = *e.component<Solid>();
+                               vec2 sta (posComp.x, posComp.y);
+                               vec2 end (sta.x + dimComp.width, sta.y + dimComp.height);
+
+                               if (mce.position > sta && mce.position < end) {
+                                       add(id.item.item->name, id.item.count);
+                                       e.destroy();
+                               }
+                       });
+               }
        } else if (mce.button == SDL_BUTTON_LEFT) {
                if ((mce.position > hotStart && mce.position < hotEnd) ||
                        (fullInventory && mce.position > fullStart && mce.position < fullEnd)) {
index ef1752f74513d414fc08dbfd5e8bdf3bc7aa6661..db343471db88cd05a28d1d6107b3be05f430c2ea 100644 (file)
@@ -232,7 +232,8 @@ bool PlayerSystem::receive(const UseItemEvent& uie)
                        if (InventorySystem::take("Arrow", 1)) {
                                auto e = game::entities.create();
                                auto pos = getPosition();
-                               e.assign<Position>(pos.x, pos.y + 10);
+                               auto dim = player.component<Solid>();
+                               e.assign<Position>(pos.x + dim->width / 2, pos.y + dim->height / 2);
 
                                auto angle = std::atan2(uie.curs.y - pos.y, uie.curs.x - pos.x);
                                e.assign<Direction>(0.25f * std::cos(angle), 0.25f * std::sin(angle));
@@ -244,12 +245,16 @@ bool PlayerSystem::receive(const UseItemEvent& uie)
                                auto frame = SpriteData(tex->sprite);
                                frame.veltate = true;
                                sprite->addSpriteSegment(frame, 0);
-                               auto dim = HLINES(sprite->getSpriteSize());
-                               e.assign<Solid>(dim.x, dim.y);
+                               auto adim = sprite->getSpriteSize();
+                               e.assign<Solid>(adim.x, adim.y);
+                               uie.attack->range.y = player.component<Solid>()->height;
                                e.assign<Hit>(uie.attack);
                                if (uie.attack->effect.size() > 0)
                                        e.component<Hit>()->effect = uie.attack->effect;
                        }
+               } else if (uie.item->type == "Food") {
+                       player.component<Health>()->health = player.component<Health>()->maxHealth;
+                       InventorySystem::take(uie.item->name, 1);
                }
 
                cool.store(false);
index 052030a73c4db504090a546d70a912b514590238..f0b2eeb238c0fccff49a407467643728d0bc2662 100644 (file)
@@ -179,16 +179,16 @@ namespace ui {
                        Color black (0, 0, 0);
                        // Create the main pause menu
                        pauseMenu.items.push_back(ui::menu::createParentButton(
-                               vec2(-128, 100), obSize, black, "Resume"));
+                               vec2(-128, 150), obSize, black, "Resume"));
 
                        pauseMenu.items.push_back(ui::menu::createChildButton(
-                               vec2(-128, 0), obSize, black, "Options", &optionsMenu));
+                               vec2(-128, 50), obSize, black, "Options", &optionsMenu));
 
                        pauseMenu.items.push_back(ui::menu::createChildButton(
-                               vec2(-128, -100), obSize, black, "Controls", &controlsMenu));
+                               vec2(-128, -50), obSize, black, "Controls", &controlsMenu));
 
                        pauseMenu.items.push_back(ui::menu::createButton(
-                               vec2(-128, -200), obSize, black, "Save and Quit",
+                               vec2(-128, -150), obSize, black, "Save and Quit",
                                []() {
                                        game::config::update(); // TODO necessary?
                                        game::config::save();
@@ -196,7 +196,7 @@ namespace ui {
                                } ));
 
                        pauseMenu.items.push_back(ui::menu::createButton(
-                               vec2(-128, -300), obSize, black, "Segfault",
+                               vec2(-128, -250), obSize, black, "Segfault",
                                []() { ++*((int *)0); } ));
 
                        // Create the options (sound) menu
index a038bee36922d54373ceec1bbbff495f9109e537..29673b01314984617d85f95f99e94ba5c4f885a9 100644 (file)
 </Dialog>
 
 <Dialog name="Sanc">
-    <text id="0" nexit="0" pause="true">
+    <text id="0" nextid="1" pause="true">
         <set id="Slow" value="0"/>
         <set id="canSprint" value="1"/>
         <set id="canJump" value="1"/>
     </text>
+       <text id="1" nextid="1">
+               <give name="Arrow" count="20" />
+               <content>Have some more, bud.</content>
+       </text>
 </Dialog>
index 921e83719733c5e55db5fd5a11768a70c5b65d2b..96c8d796b8e6e526c5d771017bb92b410ac85c6c 100644 (file)
        <Direction />
        <Solid />
        <Physics />
+       <Health value="25" />
        <Name value="birb" />
+       <Drop>
+               <item name="Fried Chicken" min="1" max="3" />
+       </Drop>
        <Wander>
                countdown = 0
                onetime = 0
index 8a622779d0553c1201b672a10b9814118edae8ea..3c81f65dd63847322c2aa5f064ff7821d72b482a 100644 (file)
@@ -22,5 +22,6 @@
        <firefly />
        <firefly />
        <firefly />
+       <birb />
 </World>