Expand first battle map and camera controls
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
export type TerrainType = 'plain' | 'road' | 'forest' | 'hill' | 'village' | 'fort' | 'camp';
|
||||
export type TerrainType = 'plain' | 'road' | 'forest' | 'hill' | 'village' | 'fort' | 'camp' | 'river' | 'cliff';
|
||||
|
||||
export type UnitClassKey = 'lord' | 'infantry' | 'cavalry' | 'spearman' | 'archer' | 'bandit' | 'yellowTurban' | 'rebelLeader';
|
||||
|
||||
@@ -8,6 +8,9 @@ export type TerrainRule = {
|
||||
alpha: number;
|
||||
moveCost: number;
|
||||
defenseBonus: number;
|
||||
passable?: boolean;
|
||||
recoveryHp?: number;
|
||||
moraleBonus?: number;
|
||||
};
|
||||
|
||||
export type UnitClassDefinition = {
|
||||
@@ -25,9 +28,11 @@ export const terrainRules: Record<TerrainType, TerrainRule> = {
|
||||
road: { label: '길', color: 0xb08b55, alpha: 0.1, moveCost: 1, defenseBonus: 0 },
|
||||
forest: { label: '숲', color: 0x355f42, alpha: 0.17, moveCost: 2, defenseBonus: 10 },
|
||||
hill: { label: '언덕', color: 0x82724e, alpha: 0.15, moveCost: 2, defenseBonus: 8 },
|
||||
village: { label: '마을', color: 0x8d6f4b, alpha: 0.2, moveCost: 1, defenseBonus: 12 },
|
||||
fort: { label: '요새', color: 0x735c46, alpha: 0.22, moveCost: 1, defenseBonus: 18 },
|
||||
camp: { label: '진영', color: 0x4f6a73, alpha: 0.17, moveCost: 1, defenseBonus: 15 }
|
||||
village: { label: '마을', color: 0x8d6f4b, alpha: 0.2, moveCost: 1, defenseBonus: 12, recoveryHp: 8, moraleBonus: 3 },
|
||||
fort: { label: '요새', color: 0x735c46, alpha: 0.22, moveCost: 1, defenseBonus: 18, recoveryHp: 10, moraleBonus: 4 },
|
||||
camp: { label: '진영', color: 0x4f6a73, alpha: 0.17, moveCost: 1, defenseBonus: 15, recoveryHp: 6, moraleBonus: 4 },
|
||||
river: { label: '강', color: 0x2c6687, alpha: 0.24, moveCost: 99, defenseBonus: -4, passable: false },
|
||||
cliff: { label: '절벽', color: 0x39342e, alpha: 0.28, moveCost: 99, defenseBonus: 20, passable: false }
|
||||
};
|
||||
|
||||
export const unitClasses: Record<UnitClassKey, UnitClassDefinition> = {
|
||||
@@ -44,7 +49,9 @@ export const unitClasses: Record<UnitClassKey, UnitClassDefinition> = {
|
||||
hill: 95,
|
||||
village: 110,
|
||||
fort: 115,
|
||||
camp: 115
|
||||
camp: 115,
|
||||
river: 0,
|
||||
cliff: 0
|
||||
}
|
||||
},
|
||||
infantry: {
|
||||
@@ -60,7 +67,9 @@ export const unitClasses: Record<UnitClassKey, UnitClassDefinition> = {
|
||||
hill: 105,
|
||||
village: 115,
|
||||
fort: 120,
|
||||
camp: 115
|
||||
camp: 115,
|
||||
river: 0,
|
||||
cliff: 0
|
||||
},
|
||||
movementCosts: {
|
||||
forest: 1,
|
||||
@@ -82,7 +91,9 @@ export const unitClasses: Record<UnitClassKey, UnitClassDefinition> = {
|
||||
hill: 80,
|
||||
village: 95,
|
||||
fort: 90,
|
||||
camp: 100
|
||||
camp: 100,
|
||||
river: 0,
|
||||
cliff: 0
|
||||
},
|
||||
movementCosts: {
|
||||
road: 1,
|
||||
@@ -103,7 +114,9 @@ export const unitClasses: Record<UnitClassKey, UnitClassDefinition> = {
|
||||
hill: 105,
|
||||
village: 105,
|
||||
fort: 110,
|
||||
camp: 110
|
||||
camp: 110,
|
||||
river: 0,
|
||||
cliff: 0
|
||||
}
|
||||
},
|
||||
archer: {
|
||||
@@ -119,7 +132,9 @@ export const unitClasses: Record<UnitClassKey, UnitClassDefinition> = {
|
||||
hill: 115,
|
||||
village: 100,
|
||||
fort: 120,
|
||||
camp: 105
|
||||
camp: 105,
|
||||
river: 0,
|
||||
cliff: 0
|
||||
},
|
||||
movementCosts: {
|
||||
hill: 1
|
||||
@@ -138,7 +153,9 @@ export const unitClasses: Record<UnitClassKey, UnitClassDefinition> = {
|
||||
hill: 115,
|
||||
village: 100,
|
||||
fort: 90,
|
||||
camp: 95
|
||||
camp: 95,
|
||||
river: 0,
|
||||
cliff: 0
|
||||
},
|
||||
movementCosts: {
|
||||
forest: 1,
|
||||
@@ -158,7 +175,9 @@ export const unitClasses: Record<UnitClassKey, UnitClassDefinition> = {
|
||||
hill: 105,
|
||||
village: 100,
|
||||
fort: 90,
|
||||
camp: 95
|
||||
camp: 95,
|
||||
river: 0,
|
||||
cliff: 0
|
||||
},
|
||||
movementCosts: {
|
||||
forest: 1
|
||||
@@ -177,7 +196,9 @@ export const unitClasses: Record<UnitClassKey, UnitClassDefinition> = {
|
||||
hill: 110,
|
||||
village: 105,
|
||||
fort: 105,
|
||||
camp: 110
|
||||
camp: 110,
|
||||
river: 0,
|
||||
cliff: 0
|
||||
},
|
||||
movementCosts: {
|
||||
forest: 1,
|
||||
|
||||
@@ -142,21 +142,27 @@ export const prologuePages: StoryPage[] = [
|
||||
];
|
||||
|
||||
export const firstBattleMap: BattleMap = {
|
||||
width: 12,
|
||||
height: 12,
|
||||
width: 20,
|
||||
height: 18,
|
||||
terrain: [
|
||||
['plain', 'plain', 'forest', 'forest', 'plain', 'road', 'road', 'hill', 'hill', 'plain', 'plain', 'plain'],
|
||||
['plain', 'forest', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'hill', 'plain', 'plain', 'plain'],
|
||||
['plain', 'forest', 'plain', 'plain', 'plain', 'road', 'forest', 'plain', 'plain', 'plain', 'plain', 'plain'],
|
||||
['plain', 'plain', 'plain', 'hill', 'hill', 'road', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain'],
|
||||
['plain', 'plain', 'plain', 'hill', 'plain', 'road', 'road', 'forest', 'plain', 'plain', 'fort', 'plain'],
|
||||
['plain', 'plain', 'plain', 'plain', 'plain', 'village', 'road', 'plain', 'plain', 'plain', 'forest', 'forest'],
|
||||
['plain', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain'],
|
||||
['forest', 'forest', 'plain', 'plain', 'plain', 'road', 'plain', 'hill', 'hill', 'plain', 'plain', 'plain'],
|
||||
['forest', 'plain', 'plain', 'plain', 'plain', 'road', 'plain', 'hill', 'plain', 'plain', 'plain', 'plain'],
|
||||
['plain', 'camp', 'plain', 'forest', 'forest', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'plain'],
|
||||
['plain', 'camp', 'camp', 'plain', 'forest', 'plain', 'road', 'plain', 'plain', 'forest', 'forest', 'plain'],
|
||||
['plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'plain']
|
||||
['forest', 'forest', 'hill', 'hill', 'cliff', 'cliff', 'hill', 'plain', 'road', 'road', 'plain', 'forest', 'hill', 'hill', 'plain', 'plain', 'forest', 'hill', 'hill', 'plain'],
|
||||
['forest', 'hill', 'hill', 'plain', 'cliff', 'hill', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'forest', 'hill', 'plain', 'plain', 'plain', 'hill', 'fort', 'plain'],
|
||||
['plain', 'forest', 'plain', 'plain', 'hill', 'hill', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'fort', 'fort', 'plain', 'plain'],
|
||||
['plain', 'plain', 'plain', 'forest', 'hill', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'fort', 'plain', 'plain', 'forest'],
|
||||
['plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'plain', 'forest', 'forest'],
|
||||
['plain', 'plain', 'plain', 'forest', 'plain', 'road', 'road', 'plain', 'forest', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'village', 'plain', 'plain', 'plain', 'forest'],
|
||||
['plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain'],
|
||||
['hill', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'hill', 'plain', 'hill', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain'],
|
||||
['hill', 'hill', 'plain', 'road', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain'],
|
||||
['plain', 'plain', 'road', 'road', 'forest', 'plain', 'plain', 'plain', 'village', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain'],
|
||||
['plain', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain', 'road', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'hill', 'plain', 'plain'],
|
||||
['road', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'forest', 'forest', 'plain', 'hill', 'hill', 'plain', 'plain', 'plain'],
|
||||
['plain', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'village', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain'],
|
||||
['plain', 'road', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'camp', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill'],
|
||||
['camp', 'road', 'plain', 'plain', 'hill', 'plain', 'hill', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'hill'],
|
||||
['camp', 'camp', 'road', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'plain', 'hill'],
|
||||
['plain', 'camp', 'road', 'plain', 'forest', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain'],
|
||||
['plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain']
|
||||
]
|
||||
};
|
||||
|
||||
@@ -180,7 +186,7 @@ export const firstBattleUnits: UnitData[] = [
|
||||
accessory: { itemId: 'peach-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 1,
|
||||
y: 9
|
||||
y: 15
|
||||
},
|
||||
{
|
||||
id: 'guan-yu',
|
||||
@@ -201,7 +207,7 @@ export const firstBattleUnits: UnitData[] = [
|
||||
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
|
||||
},
|
||||
x: 2,
|
||||
y: 10
|
||||
y: 15
|
||||
},
|
||||
{
|
||||
id: 'zhang-fei',
|
||||
@@ -222,7 +228,7 @@ export const firstBattleUnits: UnitData[] = [
|
||||
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
|
||||
},
|
||||
x: 1,
|
||||
y: 10
|
||||
y: 16
|
||||
},
|
||||
{
|
||||
id: 'rebel-a',
|
||||
@@ -242,8 +248,8 @@ export const firstBattleUnits: UnitData[] = [
|
||||
armor: { itemId: 'rebel-vest', level: 1, exp: 4 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 8,
|
||||
y: 2
|
||||
x: 10,
|
||||
y: 12
|
||||
},
|
||||
{
|
||||
id: 'rebel-b',
|
||||
@@ -263,8 +269,8 @@ export const firstBattleUnits: UnitData[] = [
|
||||
armor: { itemId: 'rebel-vest', level: 1, exp: 5 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 9,
|
||||
y: 3
|
||||
x: 12,
|
||||
y: 12
|
||||
},
|
||||
{
|
||||
id: 'rebel-c',
|
||||
@@ -284,8 +290,155 @@ export const firstBattleUnits: UnitData[] = [
|
||||
armor: { itemId: 'cloth-armor', level: 1, exp: 6 },
|
||||
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
|
||||
},
|
||||
x: 10,
|
||||
y: 2
|
||||
x: 13,
|
||||
y: 11
|
||||
},
|
||||
{
|
||||
id: 'rebel-d',
|
||||
name: '황건병',
|
||||
faction: 'enemy',
|
||||
className: '황건병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 1,
|
||||
exp: 8,
|
||||
hp: 21,
|
||||
maxHp: 21,
|
||||
attack: 6,
|
||||
move: 3,
|
||||
stats: { might: 51, intelligence: 31, leadership: 39, agility: 44, luck: 39 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 8 },
|
||||
armor: { itemId: 'rebel-vest', level: 1, exp: 5 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 6,
|
||||
y: 8
|
||||
},
|
||||
{
|
||||
id: 'rebel-e',
|
||||
name: '황건병',
|
||||
faction: 'enemy',
|
||||
className: '황건병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 1,
|
||||
exp: 8,
|
||||
hp: 21,
|
||||
maxHp: 21,
|
||||
attack: 6,
|
||||
move: 3,
|
||||
stats: { might: 50, intelligence: 33, leadership: 37, agility: 46, luck: 41 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 8 },
|
||||
armor: { itemId: 'rebel-vest', level: 1, exp: 5 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 5,
|
||||
y: 9
|
||||
},
|
||||
{
|
||||
id: 'rebel-cavalry-a',
|
||||
name: '황건기병',
|
||||
faction: 'enemy',
|
||||
className: '경기병',
|
||||
classKey: 'cavalry',
|
||||
level: 2,
|
||||
exp: 14,
|
||||
hp: 24,
|
||||
maxHp: 24,
|
||||
attack: 8,
|
||||
move: 5,
|
||||
stats: { might: 58, intelligence: 34, leadership: 45, agility: 62, luck: 42 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 12 },
|
||||
armor: { itemId: 'rebel-vest', level: 1, exp: 6 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 9,
|
||||
y: 9
|
||||
},
|
||||
{
|
||||
id: 'rebel-archer-b',
|
||||
name: '황건궁병',
|
||||
faction: 'enemy',
|
||||
className: '궁병',
|
||||
classKey: 'archer',
|
||||
level: 2,
|
||||
exp: 12,
|
||||
hp: 19,
|
||||
maxHp: 19,
|
||||
attack: 7,
|
||||
move: 3,
|
||||
stats: { might: 53, intelligence: 42, leadership: 44, agility: 57, luck: 44 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'short-bow', level: 1, exp: 12 },
|
||||
armor: { itemId: 'cloth-armor', level: 1, exp: 6 },
|
||||
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
|
||||
},
|
||||
x: 15,
|
||||
y: 5
|
||||
},
|
||||
{
|
||||
id: 'rebel-cavalry-b',
|
||||
name: '황건기병',
|
||||
faction: 'enemy',
|
||||
className: '경기병',
|
||||
classKey: 'cavalry',
|
||||
level: 2,
|
||||
exp: 16,
|
||||
hp: 25,
|
||||
maxHp: 25,
|
||||
attack: 8,
|
||||
move: 5,
|
||||
stats: { might: 60, intelligence: 35, leadership: 48, agility: 63, luck: 45 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 14 },
|
||||
armor: { itemId: 'rebel-vest', level: 1, exp: 7 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 14,
|
||||
y: 7
|
||||
},
|
||||
{
|
||||
id: 'rebel-f',
|
||||
name: '황건병',
|
||||
faction: 'enemy',
|
||||
className: '황건병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 2,
|
||||
exp: 10,
|
||||
hp: 23,
|
||||
maxHp: 23,
|
||||
attack: 7,
|
||||
move: 3,
|
||||
stats: { might: 54, intelligence: 35, leadership: 43, agility: 47, luck: 42 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 10 },
|
||||
armor: { itemId: 'rebel-vest', level: 1, exp: 6 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 15,
|
||||
y: 3
|
||||
},
|
||||
{
|
||||
id: 'rebel-g',
|
||||
name: '황건병',
|
||||
faction: 'enemy',
|
||||
className: '황건병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 2,
|
||||
exp: 11,
|
||||
hp: 23,
|
||||
maxHp: 23,
|
||||
attack: 7,
|
||||
move: 3,
|
||||
stats: { might: 55, intelligence: 36, leadership: 44, agility: 48, luck: 43 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 10 },
|
||||
armor: { itemId: 'rebel-vest', level: 1, exp: 6 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 17,
|
||||
y: 3
|
||||
},
|
||||
{
|
||||
id: 'rebel-leader',
|
||||
@@ -305,8 +458,8 @@ export const firstBattleUnits: UnitData[] = [
|
||||
armor: { itemId: 'lamellar-armor', level: 1, exp: 12 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 10,
|
||||
y: 4
|
||||
x: 16,
|
||||
y: 2
|
||||
}
|
||||
];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user