Add Great Warehouse and Great Granary, make buildings be unlocked at some Townhall levels.

This commit is contained in:
Adrian 2024-11-13 11:20:12 +01:00
parent a21585280a
commit f8157c288c
6 changed files with 80 additions and 35 deletions

View File

@ -30,6 +30,7 @@ export default [
name: 'Town Hall', name: 'Town Hall',
autoBuilt: true, autoBuilt: true,
maxLevel: 20, maxLevel: 20,
requiredTownhallLevel: 0,
cost: (level: number) => { cost: (level: number) => {
return { return {
wood: getResourceBuildingCost(level, 10), wood: getResourceBuildingCost(level, 10),
@ -56,6 +57,7 @@ export default [
name: 'Woodcutter', name: 'Woodcutter',
autoBuilt: true, autoBuilt: true,
maxLevel: 20, maxLevel: 20,
requiredTownhallLevel: 0,
cost: (level: number) => { cost: (level: number) => {
return { return {
wood: getResourceBuildingCost(level, 6), wood: getResourceBuildingCost(level, 6),
@ -83,6 +85,7 @@ export default [
name: 'Mine', name: 'Mine',
autoBuilt: true, autoBuilt: true,
maxLevel: 20, maxLevel: 20,
requiredTownhallLevel: 0,
cost: (level: number) => { cost: (level: number) => {
return { return {
wood: getResourceBuildingCost(level, 10), wood: getResourceBuildingCost(level, 10),
@ -110,6 +113,7 @@ export default [
name: 'Pit', name: 'Pit',
autoBuilt: true, autoBuilt: true,
maxLevel: 20, maxLevel: 20,
requiredTownhallLevel: 0,
cost: (level: number) => { cost: (level: number) => {
return { return {
wood: getResourceBuildingCost(level, 14), wood: getResourceBuildingCost(level, 14),
@ -137,6 +141,7 @@ export default [
name: 'Field', name: 'Field',
autoBuilt: true, autoBuilt: true,
maxLevel: 20, maxLevel: 20,
requiredTownhallLevel: 0,
cost: (level: number) => { cost: (level: number) => {
return { return {
wood: getResourceBuildingCost(level, 14), wood: getResourceBuildingCost(level, 14),
@ -159,6 +164,7 @@ export default [
type: 'warehouse', type: 'warehouse',
name: 'Warehouse', name: 'Warehouse',
maxLevel: 20, maxLevel: 20,
requiredTownhallLevel: 0,
cost: (level: number) => { cost: (level: number) => {
return { return {
wood: getStorageBuildingCost(level, 15), wood: getStorageBuildingCost(level, 15),
@ -185,6 +191,7 @@ export default [
type: 'granary', type: 'granary',
name: 'Granary', name: 'Granary',
maxLevel: 20, maxLevel: 20,
requiredTownhallLevel: 0,
cost: (level: number) => { cost: (level: number) => {
return { return {
wood: getStorageBuildingCost(level, 12), wood: getStorageBuildingCost(level, 12),
@ -207,10 +214,65 @@ export default [
}, },
}, },
}, },
{
type: 'great-warehouse',
name: 'Great Warehouse',
maxLevel: 20,
requiredTownhallLevel: 15,
cost: (level: number) => {
return {
wood: getStorageBuildingCost(level, 150),
stone: getStorageBuildingCost(level, 200),
iron: getStorageBuildingCost(level, 100),
food: getStorageBuildingCost(level, 150),
};
},
timeToBuild: (level: number) => getStandardTimeToBuild(level) * 2,
behavior: {
storage: (V: VillageState, self: BuildingType) => {
const x = self.level;
const capacity = ( ( ( x + ( x * x ) ) / 2 ) + 3 ) * 250;
return {
'wood': capacity,
'stone': capacity,
'iron': capacity,
'food': 0,
};
},
},
},
{
type: 'great-granary',
name: 'Great Granary',
maxLevel: 20,
requiredTownhallLevel: 15,
cost: (level: number) => {
return {
wood: getStorageBuildingCost(level, 120),
stone: getStorageBuildingCost(level, 220),
iron: getStorageBuildingCost(level, 100),
food:getStorageBuildingCost(level, 60),
};
},
timeToBuild: (level: number) => getStandardTimeToBuild(level) * 2,
behavior: {
storage: (V: VillageState, self: BuildingType) => {
const x = self.level;
const capacity = ( ( ( x + ( x * x ) ) / 2 ) + 3 ) * 250;
return {
'wood': 0,
'stone': 0,
'iron': 0,
'food': capacity,
};
},
},
},
{ {
type: 'university', type: 'university',
name: 'University', name: 'University',
maxLevel: 20, maxLevel: 20,
requiredTownhallLevel: 5,
cost: (level: number) => { cost: (level: number) => {
return { return {
wood: getUnitBuildingCost(level, 75), wood: getUnitBuildingCost(level, 75),
@ -237,6 +299,7 @@ export default [
type: 'barracks', type: 'barracks',
name: 'Barracks', name: 'Barracks',
maxLevel: 20, maxLevel: 20,
requiredTownhallLevel: 3,
cost: (level: number) => { cost: (level: number) => {
return { return {
wood: getUnitBuildingCost(level, 60), wood: getUnitBuildingCost(level, 60),
@ -264,6 +327,7 @@ export default [
name: 'Palace', name: 'Palace',
maxLevel: 20, maxLevel: 20,
unique: true, unique: true,
requiredTownhallLevel: 10,
cost: (level: number) => { cost: (level: number) => {
return { return {
wood: getStorageBuildingCost(level, 200), wood: getStorageBuildingCost(level, 200),

View File

@ -3,8 +3,8 @@
import buildings from "../data/buildings"; import buildings from "../data/buildings";
import moves from "../moves"; import moves from "../moves";
import showBuildingCreator from "../stores/showBuildingCreator"; import showBuildingCreator from "../stores/showBuildingCreator";
import { canPayBuildingCost } from "../utils"; import { canPayBuildingCost, getTownhall } from "../utils";
import village, { type VillageState } from "../village"; import village from "../village";
import Cost from "./Cost.svelte"; import Cost from "./Cost.svelte";
function close() { function close() {
@ -25,11 +25,13 @@
$: constructible = buildings $: constructible = buildings
.filter(b => !b.autoBuilt) .filter(b => !b.autoBuilt)
.filter(b => !(b.unique && $village.buildings.some(b2 => b2.type === b.type))) .filter(b => !(b.unique && $village.buildings.some(b2 => b2.type === b.type)))
.filter(b => !b.requiredTownhallLevel || getTownhall($village).level >= b.requiredTownhallLevel)
.map(b =>{ .map(b =>{
const building = createBuilding(b.type); const building = createBuilding(b.type);
building.level = 0; building.level = 0;
return building; return building;
}); })
.sort((a, b) => a.requiredTownhallLevel - b.requiredTownhallLevel);
</script> </script>
{ #if $showBuildingCreator !== null } { #if $showBuildingCreator !== null }

View File

@ -1,31 +0,0 @@
import type { QuestType, ResourcesType } from "./types";
import { getEmptyResources, random } from "./utils";
let uid = 0;
export function createQuest(level: number): QuestType {
const reward = getEmptyResources();
const adjustedLevel = level * level + 3;
const duration = random(adjustedLevel - 2, adjustedLevel + 2);
Object.keys(reward).forEach(r => {
const resource = r as keyof ResourcesType;
reward[resource] = random(
Math.round((duration * 5 - level * 10) * (1 + level / 3)),
Math.round((duration * 5 + level * 10) * (1 + level / 3)),
);
if (resource === 'culture') {
reward[resource] = Math.round(reward[resource] / 20);
}
});
return {
id: uid++,
duration,
reward,
level,
started: false,
};
}

View File

@ -26,6 +26,7 @@ export interface BuildingSource {
autoBuilt?: boolean; autoBuilt?: boolean;
unique?: boolean; unique?: boolean;
maxLevel: number; maxLevel: number;
requiredTownhallLevel: number;
cost: (level: number) => CostType; cost: (level: number) => CostType;
timeToBuild: (level: number) => number; timeToBuild: (level: number) => number;
behavior: { behavior: {

View File

@ -1,11 +1,11 @@
import { produce } from 'immer'; import { produce } from 'immer';
import { CULTURE_TO_WIN } from './constants'; import { CULTURE_TO_WIN } from './constants';
import { createQuest } from './create';
import { resolveMission } from './missions'; import { resolveMission } from './missions';
import type { ProductionType } from './types'; import type { ProductionType } from './types';
import { getProduction, getStorage, shuffle } from './utils'; import { getProduction, getStorage, shuffle } from './utils';
import village, { type VillageState } from "./village"; import village, { type VillageState } from "./village";
import { createQuest } from './quests';
let lastFrame: number; let lastFrame: number;

View File

@ -161,3 +161,12 @@ export function canPayBuildingCost(V: VillageState, building: BuildingType): boo
|| cost.food > V.resources.food || cost.food > V.resources.food
); );
} }
export function getTownhall(V: VillageState): BuildingType {
const townhall = V.buildings.find(b => b.type === 'townhall');
if (!townhall) {
throw new Error("Unable to find the Town hall");
}
return townhall;
}