This commit is contained in:
李鹏宇
2026-08-12 19:30:31 +08:00
parent 106d49f6de
commit d713221581
9 changed files with 62 additions and 9 deletions
+29 -2
View File
@@ -123,8 +123,8 @@
<!-- ===== 设施(平面俯视,压成菱形贴地)===== --> <!-- ===== 设施(平面俯视,压成菱形贴地)===== -->
<record id="bi_farmland" model="yt.world.build.item"> <record id="bi_farmland" model="yt.world.build.item">
<field name="code">farmland</field><field name="name">农田</field> <field name="code">farmland</field><field name="name">农田</field>
<field name="category">facility</field><field name="icon">assets/buildings/default/props/1.png</field> <field name="category">facility</field><field name="icon">assets/buildings/spring/farmland/farmland.png</field>
<field name="footprint_w">3</field><field name="footprint_h">3</field><field name="sequence">310</field> <field name="footprint_w">2</field><field name="footprint_h">2</field><field name="sequence">310</field>
<field name="flat">1</field> <field name="flat">1</field>
<field name="desc">春季播种的耕地,定期产出粮食作物。</field> <field name="desc">春季播种的耕地,定期产出粮食作物。</field>
<field name="stat_level">1</field><field name="stat_hp">60</field> <field name="stat_level">1</field><field name="stat_hp">60</field>
@@ -166,4 +166,31 @@
<field name="stat_level">1</field><field name="stat_hp">90</field> <field name="stat_level">1</field><field name="stat_hp">90</field>
<field name="stat_yield" eval="{'water': 2}"/> <field name="stat_yield" eval="{'water': 2}"/>
</record> </record>
<record id="bi_library" model="yt.world.build.item">
<field name="code">library</field><field name="name">图书馆</field>
<field name="category">build</field><field name="icon">assets/buildings/spring/library/library_l.png</field>
<field name="footprint_w">2</field><field name="footprint_h">2</field><field name="sequence">360</field>
<field name="flat">0</field>
<field name="desc">收藏典籍与卷轴,提升领地科研与知识产出。</field>
<field name="stat_level">1</field><field name="stat_hp">110</field>
<field name="stat_yield" eval="{'research': 4}"/>
</record>
<record id="bi_barracks" model="yt.world.build.item">
<field name="code">barracks</field><field name="name">兵营</field>
<field name="category">build</field><field name="icon">assets/buildings/spring/barracks/barracks_l.png</field>
<field name="footprint_w">2</field><field name="footprint_h">2</field><field name="sequence">370</field>
<field name="flat">0</field>
<field name="desc">训练士兵与储备武备的军事建筑,提升领地军事产出。</field>
<field name="stat_level">1</field><field name="stat_hp">130</field>
<field name="stat_yield" eval="{'military': 4}"/>
</record>
<record id="bi_school" model="yt.world.build.item">
<field name="code">school</field><field name="name">学堂</field>
<field name="category">build</field><field name="icon">assets/buildings/spring/school/school_l.png</field>
<field name="footprint_w">2</field><field name="footprint_h">2</field><field name="sequence">380</field>
<field name="flat">0</field>
<field name="desc">讲学习字之所,培养人才并提升领地科研积累。</field>
<field name="stat_level">1</field><field name="stat_hp">100</field>
<field name="stat_yield" eval="{'research': 3}"/>
</record>
</odoo> </odoo>
Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

+33 -7
View File
@@ -1582,7 +1582,6 @@ const BUILDINGS = {
farm: { name: '农场', icon: '🌾', color: '#8bc34a', yield: { food: 8 } }, farm: { name: '农场', icon: '🌾', color: '#8bc34a', yield: { food: 8 } },
lumber: { name: '伐木场', icon: '🪓', color: '#795548', yield: { wood: 6 } }, lumber: { name: '伐木场', icon: '🪓', color: '#795548', yield: { wood: 6 } },
mine: { name: '矿场', icon: '⛏', color: '#ff9800', yield: { metal: 5 } }, mine: { name: '矿场', icon: '⛏', color: '#ff9800', yield: { metal: 5 } },
house: { name: '民居', icon: '🏠', color: '#64b5f6', yield: { pop: 4 } },
market: { name: '集市', icon: '🏪', color: '#4dd0e1', yield: { gold: 6 } }, market: { name: '集市', icon: '🏪', color: '#4dd0e1', yield: { gold: 6 } },
temple: { name: '神庙', icon: '⛩', color: '#fff176', yield: { culture: 3 } }, temple: { name: '神庙', icon: '⛩', color: '#fff176', yield: { culture: 3 } },
barracks: { name: '兵营', icon: '⚔', color: '#ef5350', yield: { military: 8 } }, barracks: { name: '兵营', icon: '⚔', color: '#ef5350', yield: { military: 8 } },
@@ -1717,8 +1716,11 @@ const MICRO_BUILD_EXTRA = [
{ id: 'restaurant', cat: 'build', icon: 'assets/buildings/spring/restaurant/restaurant_l.png',name: '饭馆', desc: '烹制料理,为居民提供饱食与心情加成。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 95, statYield: { satiety: 3 } }, { id: 'restaurant', cat: 'build', icon: 'assets/buildings/spring/restaurant/restaurant_l.png',name: '饭馆', desc: '烹制料理,为居民提供饱食与心情加成。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 95, statYield: { satiety: 3 } },
{ id: 'pasture', cat: 'business', icon: 'assets/buildings/spring/pasture/pasture_l.png', name: '牧场', desc: '放养牲畜,稳定产出肉奶类资源。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 105, statYield: { meat: 2, milk: 1 } }, { id: 'pasture', cat: 'business', icon: 'assets/buildings/spring/pasture/pasture_l.png', name: '牧场', desc: '放养牲畜,稳定产出肉奶类资源。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 105, statYield: { meat: 2, milk: 1 } },
{ id: 'blackmarket', cat: 'build', icon: 'assets/buildings/spring/blackmarket/blackmarket_l.png',name:'黑市', desc: '灰色交易点,可换取稀有物资但伴随风险。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 80, statYield: { rare: 1 } }, { id: 'blackmarket', cat: 'build', icon: 'assets/buildings/spring/blackmarket/blackmarket_l.png',name:'黑市', desc: '灰色交易点,可换取稀有物资但伴随风险。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 80, statYield: { rare: 1 } },
{ id: 'farmland', cat: 'business', icon: 'assets/buildings/default/props/1.png', name: '农田', desc: '春季播种的耕地,定期产出粮食作物。', flat: true, w: 2, h: 2, statLevel: 1, statHp: 60, statYield: { food: 3 } }, { id: 'farmland', cat: 'business', icon: 'assets/buildings/spring/farmland/farmland.png', name: '农田', desc: '春季播种的耕地,定期产出粮食作物。', flat: true, w: 2, h: 2, statLevel: 1, statHp: 60, statYield: { food: 3 } },
{ id: 'well', cat: 'build', icon: 'assets/buildings/default/props/well_l.png', name: '水井', desc: '汲取地下水的圆井,保障饮水与灌溉。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 90, statYield: { water: 2 } }, { id: 'well', cat: 'build', icon: 'assets/buildings/default/props/well_l.png', name: '水井', desc: '汲取地下水的圆井,保障饮水与灌溉。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 90, statYield: { water: 2 } },
{ id: 'library', cat: 'build', icon: 'assets/buildings/spring/library/library_l.png', name: '图书馆', desc: '收藏典籍与卷轴,提升领地科研与知识产出。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 110, statYield: { research: 4 } },
{ id: 'barracks', cat: 'build', icon: 'assets/buildings/spring/barracks/barracks_l.png', name: '兵营', desc: '训练士兵与储备武备的军事建筑,提升领地军事产出。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 130, statYield: { military: 4 } },
{ id: 'school', cat: 'build', icon: 'assets/buildings/spring/school/school_l.png', name: '学堂', desc: '讲学习字之所,培养人才并提升领地科研积累。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 100, statYield: { research: 3 } },
]; ];
// 建筑交互配置(数据驱动,与后端 BUILD_EFFECTS 的 (code,action) 对应)。 // 建筑交互配置(数据驱动,与后端 BUILD_EFFECTS 的 (code,action) 对应)。
@@ -1790,6 +1792,21 @@ const BUILD_INTERACT = {
{ action: 'stall', label: '摆摊', icon: '🏪', desc: '摆摊获得金币' }, { action: 'stall', label: '摆摊', icon: '🏪', desc: '摆摊获得金币' },
{ action: 'upgrade', label: '升级', icon: '⬆️', desc: '升级集市' }, { action: 'upgrade', label: '升级', icon: '⬆️', desc: '升级集市' },
] }, ] },
library: { title: '图书馆', tagline: '典籍与知识', actions: [
{ action: 'study', label: '研读', icon: '📖', desc: '研读典籍,获取科研点' },
{ action: 'archive', label: '整理卷轴', icon: '🗂', desc: '整理卷轴,提升知识产出' },
{ action: 'upgrade', label: '升级', icon: '⬆️', desc: '升级图书馆' },
] },
barracks: { title: '兵营', tagline: '训练与征召', actions: [
{ action: 'recruit', label: '招募', icon: '🛡️', desc: '招募新兵,补充兵员' },
{ action: 'drill', label: '操练', icon: '⚔️', desc: '操练部队,提升军事产出' },
{ action: 'upgrade', label: '升级', icon: '⬆️', desc: '升级兵营' },
] },
school: { title: '学堂', tagline: '讲学与习字', actions: [
{ action: 'lecture', label: '讲学', icon: '📚', desc: '开设讲习,提升科研积累' },
{ action: 'study', label: '习字', icon: '✍️', desc: '习字读书,培养人才' },
{ action: 'upgrade', label: '升级', icon: '⬆️', desc: '升级学堂' },
] },
}; };
// 装备目录:每个槽位的候选装备(图标 + 简短加成,仅作展示/穿戴)。 // 装备目录:每个槽位的候选装备(图标 + 简短加成,仅作展示/穿戴)。
@@ -1985,24 +2002,33 @@ function microDrawPlaced(ctx, b, it, cell, ew, eh) {
ctx.drawImage(img, -s / 2, -s / 2, s, s); ctx.drawImage(img, -s / 2, -s / 2, s, s);
ctx.restore(); ctx.restore();
} else if (flat) { } else if (flat) {
// 平面俯视:把方形贴图经「缩放 + 45°旋转 + 纵向压扁」投影到 cell×cell/2 菱形 // 平面俯视:把方形贴图经「缩放 + 45°旋转 + 纵向压扁」投影到 footprint 菱形内
// 贴图尺寸与占地格边缘对齐 // s 取 cell*max(ew,eh)/sqrt(2)≈0.71,让方形旋转后宽≈占地宽,再 clip 到 footprint 防溢出
ctx.save(); ctx.save();
const s = cell * Math.max(ew, eh) * 1.65; const hw = cell / 2, hh = cell / 4;
ctx.beginPath();
ctx.moveTo(0, -eh * hh);
ctx.lineTo(ew * hw, 0);
ctx.lineTo(0, eh * hh);
ctx.lineTo(-ew * hw, 0);
ctx.closePath();
ctx.clip();
const s = cell * Math.max(ew, eh) * 0.72;
ctx.transform(1, 0, 0, 0.5, 0, 0); ctx.transform(1, 0, 0, 0.5, 0, 0);
ctx.rotate(Math.PI / 4); ctx.rotate(Math.PI / 4);
ctx.drawImage(img, -s / 2, -s / 2, s, s); ctx.drawImage(img, -s / 2, -s / 2, s, s);
ctx.restore(); ctx.restore();
} else { } else {
// 3/4 立绘建筑:按 rot 切换 _r/_l 视角;180/270 做水平翻转表示背面,取消 canvas 整体旋转 // 3/4 立绘建筑:按 rot 切换 _r/_l 视角;180/270 做水平翻转表示背面,取消 canvas 整体旋转
// 尺寸贴合占位地块:底宽 = 占位格宽,与格子边缘对齐 // 尺寸贴合占位地块:底宽 = 占位格宽,与格子边缘对齐;
// 图片脚底对齐 footprint 菱形最下方顶点,避免建筑“浮”在占地左上角。
const dim = Math.max(ew, eh); const dim = Math.max(ew, eh);
const w = cell * dim; // 建筑底宽 = 占位格宽 const w = cell * dim; // 建筑底宽 = 占位格宽
const h = w / 0.85; // 维持原宽高比(建筑立绘偏高) const h = w / 0.85; // 维持原宽高比(建筑立绘偏高)
const flip = (rot === 180 || rot === 270); const flip = (rot === 180 || rot === 270);
ctx.save(); ctx.save();
ctx.scale(flip ? -1 : 1, 1); ctx.scale(flip ? -1 : 1, 1);
ctx.drawImage(img, -w / 2, -h * 0.85, w, h); ctx.drawImage(img, -w / 2, eh * cell / 4 - h, w, h);
ctx.restore(); ctx.restore();
} }
return; return;