From: dsc Date: Thu, 10 Feb 2011 11:14:36 +0000 (-0800) Subject: Checkpoint on new inventory. X-Git-Url: http://git.less.ly:3516/?a=commitdiff_plain;h=9a6102f56a04fad5613efcb0a23b96f3fe5c63e4;p=tanks.git Checkpoint on new inventory. --- diff --git a/data/types/items.yaml b/data/types/items.yaml index 9b2505e..911a84b 100644 --- a/data/types/items.yaml +++ b/data/types/items.yaml @@ -1,7 +1,22 @@ name: items defaults: symbol: tanks/thing/item.Item + passives: [] + effects: [] + cooldowns: [] + art: + map_icon: '' + inv_icon: '' types: + backpack: + name: Backpack + bagName: backpack + desc: Your backpack. + tags: [ 'bag', 'backpack' ] + symbol: tanks/inventory/bag.Bag + max: 12 + art: + inv_icon: '/img/items/backpack.jpg' nitro: name: Nitro desc: Speeds up your tank temporarily. diff --git a/src/Y/core.cjs b/src/Y/core.cjs index 706755e..43776b5 100644 --- a/src/Y/core.cjs +++ b/src/Y/core.cjs @@ -115,7 +115,7 @@ function extend( A, B ){ return args.reduce(_extend, A); } function _extend(A, donor){ return reduce(donor, attrvk, A); } -function attrvk(o, v, k){ return attr(o, k, v, o[k]); } +function attrvk(o, v, k){ return (v === undefined && o[k] === undefined) ? o : attr(o, k, v, o[k]); } /** * Fetches the descriptor for each property that is an accessor (getter/setter). diff --git a/src/tanks/game.cjs b/src/tanks/game.cjs index 2fe1856..a6ca65a 100644 --- a/src/tanks/game.cjs +++ b/src/tanks/game.cjs @@ -79,7 +79,7 @@ evt.subclass('Game', { Thing.on('destroy', this.killUnit); this.on('tick', this.tick); - this.level.setup(); + this.level.setup(tanks.data); // if (this.player) { // this.backpack = new Backpack(this.player) diff --git a/src/tanks/inventory/bag.cjs b/src/tanks/inventory/bag.cjs index d535721..ee007ad 100644 --- a/src/tanks/inventory/bag.cjs +++ b/src/tanks/inventory/bag.cjs @@ -15,7 +15,6 @@ Item.subclass('Bag', { /// Setup /// hasUI : true, - uiOptions : null, reqs : null, // highlightIconOnOpen : true, // Whether to highlight the inventory icon when bag is open @@ -24,9 +23,10 @@ Item.subclass('Bag', { ui : null, // ContainerUI - init : function initBag(owner, bagName){ - this.bagName = bagName; - this.owner = owner; + init : function initBag(owner, bagName, options){ + if (options) Y.core.extend(this, options); + if (owner) this.owner = owner; + if (bagName) this.bagName = bagName; Item.init.call(this); }, @@ -60,7 +60,7 @@ Item.subclass('Bag', { onAcquired : function onAcquired(evt, container){ Item.fn.onAcquired.apply(this, arguments); // this.parent = container; - this.showUI(); + // this.showUI(); }, onLost : function onLost(evt){ diff --git a/src/tanks/inventory/bagbag.cjs b/src/tanks/inventory/bagbag.cjs index bec16a8..3c59c7e 100644 --- a/src/tanks/inventory/bagbag.cjs +++ b/src/tanks/inventory/bagbag.cjs @@ -9,13 +9,11 @@ var Y = require('Y') BagBag = exports['BagBag'] = Bag.subclass('BagBag', { - __mixins__ : [], - __bind__ : [], - __static__ : {}, /// Setup /// hasUI : true, - uiOptions : null, + max : 1, + cols : 3, reqs : 'bag', // TODO: parse, enforce reqs // highlightIconOnOpen : true, // Whether to highlight the inventory icon when bag is open @@ -24,9 +22,9 @@ Bag.subclass('BagBag', { ui : null, // ContainerUI - init : function initBagBag(inventory, player){ + init : function initBagBag(inventory, player, options){ this.inventory = inventory; - Bag.init.call(this, player, 'bagbag'); + Bag.init.call(this, player, 'bagbag', options); this.showUI(); if (this.ui) this.ui.layer.addClass('bagbag bag'); } diff --git a/src/tanks/inventory/container.cjs b/src/tanks/inventory/container.cjs index 25b005f..f727d9a 100644 --- a/src/tanks/inventory/container.cjs +++ b/src/tanks/inventory/container.cjs @@ -114,8 +114,8 @@ Mixin.subclass('Container', { // Note item we're displacing, if any , dispItem = this.slots[idx] - , didDisplace = dispItem && dispItem !== item - , sameOwner = this.owner && item.owner && this.owner === item.owner + , didDisplace = !!(dispItem && dispItem !== item) + , sameOwner = !!(this.owner && item.owner && this.owner === item.owner) , newPickup = !(oldBag && sameOwner) , inventoryMove = sameOwner && !this.hasItem(item) , localMove = sameOwner && !inventoryMove @@ -147,7 +147,7 @@ Mixin.subclass('Container', { } var eq = this.equipsContents - , oldEq = oldBag.equipsContents + , oldEq = !!(oldBag && oldBag.equipsContents) , isEquipped = sameOwner && oldEq , evt = 'item'+(newPickup ? '.acquire' : '.move')+(eq ? (!isEquipped ? '.equip' : '') : (isEquipped ? '.unequip' : '')) , dispEvt = 'item.move'+(!eq ? (oldEq ? '.equip' : '') : (!oldEq ? '.unequip' : '')) @@ -158,19 +158,7 @@ Mixin.subclass('Container', { if ( didDisplace ) { oldBag._putItem(dispItem, oldIdx); - oldBag._emitItemChange('item.move', dispItem, { 'idx':oldIdx, 'oldBag':this, 'oldIdx':idx }); - } - - if ( inventoryMove ) { - if ( didDisplace ) { - oldBag._putItem(dispItem, oldIdx); - oldBag._emitItemChange('item.move', dispItem, { 'idx':oldIdx, 'oldBag':this, 'oldIdx':idx }); - } - this._emitItemChange('item.move', item, { 'idx':idx, 'oldBag':inv.bag, 'oldIdx':inv.idx }); - } else { - evt = - dispEvt = 'item.'+(oldBag.equipsContents ? '.equip' : ''); - this._emitItemChange(evt, item, { 'idx':idx, 'oldBag':inv.bag, 'oldIdx':inv.idx }); + oldBag._emitItemChange(dispEvt, dispItem, { 'idx':oldIdx, 'oldBag':this, 'oldIdx':idx }); } return this; @@ -263,7 +251,7 @@ Mixin.subclass('Container', { ; // Bag bounds check - if ( 0 <= idx && idx < this.max ) + if ( idx < 0 || idx >= this.max ) return false; if ( this.items[id] ) @@ -324,7 +312,7 @@ Mixin.subclass('Container', { * @return {this} */ _emitItemChange : function _emitItemChange(evt, item, data){ - data = Y.extend({ 'item':item, 'bag':this, 'unit':this.owner }, data || {}); + data = Y.core.extend({ 'item':item, 'bag':this, 'unit':this.owner }, data || {}); this.emit(evt, item, data, item); item.emit(evt, this, data, this); // unit.emit(evt, item, data); // inventory should take care of this diff --git a/src/tanks/inventory/inventory.cjs b/src/tanks/inventory/inventory.cjs index bd9e8ff..9ea2070 100644 --- a/src/tanks/inventory/inventory.cjs +++ b/src/tanks/inventory/inventory.cjs @@ -60,8 +60,12 @@ evt.subclass('Inventory', { this.bagbag = new BagBag(this, owner); + // TODO: Add saved items + var backpack = tanks.data.items.backpack.instantiate(); + this.bagbag.addItem(backpack); + this.bagbag.ui.refresh(); + // instantiate: - // - backpack // - equip slots // - belt }, diff --git a/src/tanks/map/level.cjs b/src/tanks/map/level.cjs index b0b8425..da9e1ae 100644 --- a/src/tanks/map/level.cjs +++ b/src/tanks/map/level.cjs @@ -33,7 +33,7 @@ new evt.Class('Level', { this.bbox = shape.bbox; }, - setup : function setup(isReplay){ + setup : function setup(repo){ var game = this.game; this.bounds = @@ -46,15 +46,13 @@ new evt.Class('Level', { return Wall.createApply(wall.type, wall.args); }); - var data = tanks.data.units; + var data = repo.units; this.units.map(function(x){ - // if (isReplay && x.type === 'player') - // return null; var obj = data[x.type].instantiate(x.align); return game.addUnit(obj, x.loc[0], x.loc[1]); }); - var data = tanks.data.items; + var data = repo.items; this.items.map(function(x){ var obj = data[x.type].instantiate(); return game.addUnit(obj, x.loc[0], x.loc[1]); diff --git a/src/tanks/ui/inventory/containerui.cjs b/src/tanks/ui/inventory/containerui.cjs index 39936ab..0848264 100644 --- a/src/tanks/ui/inventory/containerui.cjs +++ b/src/tanks/ui/inventory/containerui.cjs @@ -13,30 +13,37 @@ HtmlLayer.subclass('ContainerUI', { __bind__ : [ 'onItemUpdated', 'onDrop' ], _layerClasses : 'item-container hud', + inherit : 'name title showTitle max cols'.split(' '), + name : null, title : null, showTitle : false, defaultContainer : false, max : 1, - reqs : null, + cols : 3, unit : null, - + slots : null, init : function initContainerUI(unit, container, options){ + var keys = (options||{}).inherit || this.inherit; + for (var i=0, L=keys.length, k=keys[i]; i'+(this.title || this.name.toLowerCase())+'' ); this.slots = new Y(0, this.max).map(this._makeSlot, this); + this.layer.append('
'); if (this.defaultContainer) { unit.on('item.acquire', this.onItemUpdated); @@ -50,6 +57,15 @@ HtmlLayer.subclass('ContainerUI', { }, refresh : function refresh(){ + var len = this.slots.length + , el = this.slots[0].layer + , cols = Math.min(this.cols,len) + , rows = Math.ceil(len / cols) + , w = el.outerWidth() + , m = parseInt(el.css('margin-left').slice(0,-2)) + ; + this.layer.width( w*cols + m*2*cols ); + this.slots.invoke('refresh'); this.layer.find('.slot') .droppable({ @@ -94,7 +110,7 @@ HtmlLayer.subclass('ContainerUI', { ContainerUISlot = exports['ContainerUISlot'] = Layer.subclass('ContainerUISlot', { - _layerClasses : 'item-container slot hud ', + _layerClasses : 'item-container slot hud', hasCanvas : false, artWidth : 50, @@ -106,11 +122,11 @@ Layer.subclass('ContainerUISlot', { item : null, - init : function initContainerUISlot(container, idx){ + init : function initContainerUISlot(parent, idx){ Y.bindAll(this, 'onActivate', 'onDragStart'); Layer.init.call(this); - this.container = container; - this.inventory = container.inventory; + this.parent = parent; + this.container = parent.container; this.idx = idx; this.layer.addClass('slot'+idx); this.inner = @@ -199,7 +215,7 @@ Layer.subclass('ContainerUISlot', { }, toString : function(){ - return this.className+'(idx='+this.idx+', item='+this.item+')'; + return 'ContainerUISlot(idx='+this.idx+', item='+this.item+')'; } }) diff --git a/www/css/lttl.css b/www/css/lttl.css index 689c605..210cea6 100644 --- a/www/css/lttl.css +++ b/www/css/lttl.css @@ -48,13 +48,14 @@ td { text-align:center; vertical-align:middle; } #game { position:absolute; width:100%; height:100%; margin:0; padding:0; } #viewport { position:relative; margin:1em auto; cursor:crosshair; width:auto; /* width:500px; height:500px; overflow:hidden; top:50px; left:50px; */ } #viewport .layer.grid { outline:1px solid rgba(255,255,255,0.1); } -#backpack { position:absolute; bottom:1em; right:1em; width:304px; height:254px; } -.item-container {} +.item-container { position:absolute; } .item-container h3 { color:#fff; margin:0.25em; padding:0.5em 0; } .item-container .slot { float:left; position:relative; width:50px; height:50px; margin:0.25em; border:1px solid transparent; } .item-container .slot.drophover { border:1px solid #FFF6AE; } +#backpack { position:absolute; bottom:82px; right:1em; /* width:304px; height:254px; */ } +#bagbag { bottom:1em; right:1em; } .debug { z-index:5000; } diff --git a/www/img/items/backpack.jpg b/www/img/items/backpack.jpg new file mode 100644 index 0000000..a2c8bfe Binary files /dev/null and b/www/img/items/backpack.jpg differ