@kitten-science/kitten-scientists
Version:
Add-on for the wonderful incremental browser game: https://kittensgame.com/web/
579 lines • 19.9 kB
TypeScript
import type { AnyFunction } from "@oliversalzburg/js-utils/core.js";
import type { Metadata } from "./buildings.js";
import type { BuildingStackableBtnController, ButtonModern, ButtonModernController, IChildrenAware, IGameAware, Panel, Tab, TabManager, UnsafeBuildingBtnModernModel, UnsafeButtonModel, UnsafeButtonModernModel, UnsafeButtonModernModelDefaults } from "./core.js";
import type { GamePage } from "./game.js";
import type { Biome, Job, Link, Price, Resource, ResourceCraftable, Trait } from "./index.js";
export type VillageManager = TabManager & {
kittens: number;
maxKittens: number;
kittensPerTickBase: number;
/**
* amount of catnip per tick that kitten consumes
*/
catnipPerKitten: number;
/**
* percents of happiness modifier
*/
happiness: number;
jobs: Array<UnsafeJob>;
jobNames: Array<unknown>;
/**
* resource modifiers per tick
*/
resourceModifiers: {
catnip: 0;
};
game: GamePage;
sim: KittenSim;
map: Map;
deathTimeout: 0;
/**
* a reference to a leader kitten for fast access, must be restored on load
*/
leader: Kitten | null;
senators: Array<unknown>;
traits: Array<unknown>;
getRankExp: (rank: number) => number;
canHaveLeaderOrPromote: () => boolean;
getEffectLeader: <TDefaultObject>(role: "manager" | "scientist", defaultObject: TDefaultObject) => TDefaultObject;
updateEffectCached: () => void;
new (game: GamePage): VillageManager;
loadoutController: LoadoutController;
getJob: (name: Job) => UnsafeJob;
getBiome: (id: string) => unknown;
getJobLimit: (jobName: Job) => number;
assignJob: (job: UnsafeJob, count: number) => void;
unassignJob: (kitten: Kitten) => void;
calculateSimMaxKittens: () => number;
calculateKittensPerTick: () => number;
update: () => void;
fastforward: (daysOffset: number) => void;
getFreeKittens: () => number;
hasFreeKittens: (amt?: number) => boolean;
getWorkerKittens: (jobName: Job) => number;
getFreeEngineers: () => number;
clearJobs: (hard: boolean) => void;
getKittens: () => unknown;
/**
* Get a list of resource modifiers per tick
* This method returns positive villager production that can be multiplied by building bonuses
*/
getResProduction: () => Record<Resource, number>;
updateResourceProduction: () => void;
updateTraits: () => void;
makeLeader: (kitten: Kitten) => void;
removeLeader: () => void;
getLeaderBonus: (rank: number) => number;
/**
* Same but with negative values
*
* @see getResProduction
*/
getResConsumption: () => Record<Resource, number>;
resetState: () => void;
save: (saveData: unknown) => void;
load: (saveData: unknown) => void;
getUnhappiness: () => number;
getEnvironmentEffect: () => number;
getOverpopulation: () => number;
updateHappines: () => void;
sendHunters: () => void;
huntAll: () => void;
gainHuntRes: (squads: unknown) => void;
holdFestival: (amt: number) => void;
rand: (val: unknown) => ReturnType<GamePage["rand"]>;
optimizeJobs: () => void;
promoteKittens: () => void;
promoteKittensRepeatedly: () => void;
_promoteKittensInternal: () => {
numPromoted: number;
numNotEnoughGold: number;
numNotEnoughExp: number;
};
getValueModifierPerSkill: (value: number) => number;
getSkillExpRange: (value: number) => number;
getStyledName: (kitten: Kitten, isLeaderPanel: unknown) => string;
};
export type Kitten = {
statics: {
SAVE_PACKET_OFFSET: number;
};
names: Array<string>;
surnames: Array<string>;
traits: Array<UnsafeTrait>;
colors: Array<{
color: string;
}>;
varieties: Array<{
style: string;
}>;
name: string;
surname: string;
job: null;
trait: UnsafeTrait;
age: number;
skills: Record<string, unknown>;
exp: number;
rank: number;
/**
* a growth/skill potential, 0 if none
*/
rarity: number;
/**
* kitten color, the higher the rarer, 0 if none
*/
color: number;
/**
* rare kitten pattern variety
*/
variety: number;
isLeader: boolean;
/**
* obsolete
* @deprecated
*/
isSenator: boolean;
favorite: boolean;
rand: (ratio: number) => number;
load: (data: unknown, jobNames: unknown) => void;
loadUncompressed: (data: unknown) => void;
loadCompressed: (data: unknown, jobNames: unknown) => void;
_splitSSN: (mergedResult: number, numberOfValues: number) => Array<number>;
save: (compress: boolean, jobNames: unknown) => unknown;
saveUncompressed: () => unknown;
saveCompressed: (jobNames: Array<Job>) => unknown;
_mergeSSN: (values: Array<number>) => number;
_getTraitIndex: (name: Trait) => number;
engineerSpeciality?: ResourceCraftable;
};
export type Map = {
game: GamePage;
villageLevel: number;
/**
* % explored, affects your priceRatio
*/
exploredLevel: number;
/**
* point on map currently being explored
*/
currentBiome: UnsafeBiome | null;
/**
* level of expedition squad
*/
explorersLevel: number;
/**
* level of your supply depo
*/
hqLevel: number;
/**
* hp of a current squad
*/
hp: number;
/**
* energy/stamina/supplies of your exploration squad
*/
energy: number;
defaultFaunaNames: ["giant moth", "mantis", "slime mold"];
biomes: Array<UnsafeBiome>;
new (game: GamePage): Map;
init: () => void;
resetMap: () => void;
toLevel: (biome: UnsafeBiome) => number;
update: () => void;
getMaxEnergy: () => number;
getMaxHP: () => number;
explore: (biomeId: string) => void;
combat: () => void;
onLevelUp: (biome: UnsafeBiome) => void;
getBiomeRewards: (biome: UnsafeBiome) => unknown;
getExplorationPrice: (x: number, y: number) => number;
getExploreRatio: () => number;
getPriceReduction: () => number;
updateEffectCached: () => void;
save: () => {
hqLevel: number;
energy: number;
explorersLevel: number;
};
load: (data: {
hqLevel: number;
energy: number;
explorersLevel: number;
}) => void;
};
export type BiomeBtnController = ButtonModernController<UnsafeBiomeBtnModel> & {
fetchModel: (options: {
id: string;
}) => UnsafeBiomeBtnModel;
clickHandler: (model: UnsafeBiomeBtnModel, event: unknown) => void;
getName: (model: UnsafeBiomeBtnModel) => string;
updateVisible: (model: UnsafeBiomeBtnModel) => void;
updateEnabled: (model: UnsafeBiomeBtnModel) => void;
};
export type BiomeBtn = ButtonModern<UnsafeBiomeButtonOptions> & {
renderLinks: () => void;
update: () => void;
getTooltipHTML: () => (controller: BiomeBtnController, model: UnsafeBiomeBtnModel) => string;
};
export type UpgradeHQController = BuildingStackableBtnController<UnsafeUpgradeHQBtnModel> & {
defaults: () => UnsafeUpgradeHQBtnModel;
getMetadata: (model: UnsafeUpgradeHQBtnModel) => {
label: string;
description: string;
val: number;
on: number;
};
getPrices: (model: UnsafeUpgradeHQBtnModel) => Array<Price>;
buyItem: (model: unknown, event: unknown) => ReturnType<BuildingStackableBtnController["buyItem"]>;
incrementValue: (model: {
metadata: Metadata<UnsafeUpgradeHQBtnModel>;
}) => void;
hasSellLink: (model: unknown) => false;
updateVisible: (model: UnsafeUpgradeHQBtnModel) => void;
};
export type UpgradeExplorersController = BuildingStackableBtnController & {
defaults: () => UnsafeUpgradeExplorersBtnModel;
getMetadata: (model: UnsafeUpgradeExplorersBtnModel) => {
label: string;
description: string;
val: number;
on: number;
};
getPrices: (model: UnsafeUpgradeExplorersBtnModel) => Array<Price>;
buyItem: (model: unknown, event: unknown) => ReturnType<BuildingStackableBtnController["buyItem"]>;
incrementValue: (model: {
metadata: Metadata<UnsafeUpgradeExplorersBtnModel>;
}) => void;
hasSellLink: (model: unknown) => false;
updateVisible: (model: UnsafeUpgradeExplorersBtnModel) => void;
};
export type MapOverviewWgt = IChildrenAware<BiomeBtn> & IGameAware & {
new (game: GamePage): MapOverviewWgt;
game: GamePage;
upgradeExplorersBtn: ButtonModern<UnsafeUpgradeExplorersButtonOptions>;
upgradeHQBtn: ButtonModern<UnsafeUpgradeHQButtonOptions>;
render: (container?: HTMLElement) => void;
update: () => void;
};
export type KittenSim = {
kittens: Array<Kitten>;
game: GamePage;
/**
* If 1 or more, will increment kitten pool
*/
nextKittenProgress: number;
maxKittens: number;
hadKittenHunters: boolean;
new (game: GamePage): KittenSim;
update: (kittensPerTick: number, times: number) => void;
addKitten: () => void;
killKittens: (amount: number) => number;
sortKittensByExp: () => void;
sortKittensByFavorite: () => void;
sortKittensByColor: () => void;
sortKittensByVariety: () => void;
getKittens: () => number;
rand: (ratio: number) => number;
getSkillsSorted: (skillsDict: unknown) => Array<unknown>;
getSkillsSortedWithJob: (skillsDict: unknown, job: Job) => Array<unknown>;
assignJob: (job: unknown, amt: number) => void;
removeJob: (job: unknown, amt: number) => void;
assignCraftJob: (craft: unknown) => boolean;
unassignCraftJob: (craft: unknown) => boolean;
unassignCraftJobIfEngineer: (job: Job, kitten: Kitten) => void;
clearCraftJobs: () => void;
promote: (kitten: Kitten, rank: number) => number;
expToPromote: (rankBase: number, rankFinal: number, expNeeded: number) => [boolean, number];
goldToPromote: (rankBase: number, rankFinal: number, goldNeeded: number) => [boolean, number];
canPromote: (kitten: Kitten) => boolean;
clearJobs: (hard: boolean) => void;
};
export type LoadoutController = {
game: GamePage;
loadouts: Array<unknown>;
defaultLoadouts: Array<unknown>;
new (game: GamePage): LoadoutController;
toggleDefaultLoadouts: () => void;
};
export type Loadout = {
game: GamePage;
title: null;
jobs: Array<unknown>;
leaderTrait: null;
leaderJob: null;
engineerJobs: Array<unknown>;
pinned: boolean;
isDefault: boolean;
new (game: GamePage, isDefault: boolean): Loadout;
save: () => {
title: string;
jobs: Array<unknown>;
engineerJobs: Array<unknown>;
leaderTrait: null;
pinned: boolean;
isDefault: boolean;
};
load: (data: {
title: string;
jobs: Array<unknown>;
engineerJobs: Array<unknown>;
leaderTrait: null;
pinned: boolean;
isDefault: boolean;
}) => void;
saveLoadout: (setDefault: boolean) => void;
setLoadout: (setLeader: boolean) => void;
assignCraftJob: (craft: unknown, value: number) => void;
renameLoadout: () => void;
getLoadoutJobsSum: () => number;
getLoadoutEngineerJobsSum: () => number;
};
export type LoadoutButtonController = ButtonModernController & {
defaults: () => UnsafeLoadoutButtonModelDefaults;
clickHandler: (model: UnsafeLoadoutButtonModel) => void;
getDescription: (model: UnsafeLoadoutButtonModel) => string;
fetchModel: (options: unknown) => UnsafeLoadoutButtonModel;
deleteLoadout: (loadout: Loadout) => void;
saveLoadout: (loadout: Loadout) => void;
renameLoadout: (loadout: Loadout) => void;
};
export type LoadoutButton = ButtonModern<UnsafeLoadoutButtonOptions> & {
renderLinks: () => void;
editLinks?: Array<Link>;
pinLink?: Link;
};
export type JobButtonController = ButtonModernController & {
defaults: () => UnsafeJobButtonModelDefaults;
initModel: (options: unknown) => UnsafeJobButtonModel;
getJob: (model: UnsafeBiomeBtnModel) => UnsafeJob;
updateEnabled: (model: UnsafeBiomeBtnModel) => void;
getName: (model: UnsafeBiomeBtnModel) => string;
getDescription: (model: UnsafeBiomeBtnModel) => string;
updateVisible: (model: UnsafeBiomeBtnModel) => void;
clickHandler: (model: UnsafeBiomeBtnModel, event: Event) => void;
unassignJobs: (model: UnsafeBiomeBtnModel, amt: number) => void;
unassignAllJobs: (model: UnsafeBiomeBtnModel) => void;
assignJobs: (model: UnsafeBiomeBtnModel, amt: number) => void;
assignAllJobs: (model: UnsafeBiomeBtnModel) => void;
fetchModel: (options: unknown) => UnsafeJobButtonModel;
getEffects: (model: UnsafeBiomeBtnModel) => UnsafeJob["modifiers"];
getFlavor: (model: UnsafeBiomeBtnModel) => UnsafeJob["flavor"];
};
export type JobButton = ButtonModern<UnsafeJobButtonOptions> & {
renderLinks: () => void;
unassignLinks?: Array<Link>;
assignLinks?: Array<Link>;
};
export type Census = {
game: GamePage;
records: Array<unknown>;
container: HTMLElement;
statics: {
filterJob: null;
filterTrait: null;
sortKittens: null;
startKitten: number;
};
/**
* Total count of kittens that meet the filter
*/
numKittensFiltered: number;
sortOptions: Array<{
name: "color" | "exp" | "favorite" | "variety";
title: string;
}>;
governmentDiv: null;
leaderDiv: null;
expDiv: null;
jobBonusDiv: null;
promoteLeaderHref: null;
unassignLeaderJobHref: null;
new (game: GamePage): Census;
_applyJobFilter: (kitten: Kitten, filter: Job) => boolean;
_applyTraitFilter: (kitten: Kitten, filter: Trait) => boolean;
render: (container?: HTMLElement) => void;
getGovernmentInfo: () => string;
getSkillInfo: (kitten: Kitten) => string;
renderGovernment: (container: HTMLElement) => void;
updateGovernment: () => void;
renderPageSwitching: (container: HTMLElement) => void;
update: () => void;
};
export type CensusPanel = Panel & {
census: Census;
needsRefresh: boolean;
new (name: unknown, village: unknown, game: GamePage): CensusPanel;
render: (container?: unknown) => void;
update: () => void;
};
export type VillageButtonController<TModel extends UnsafeButtonModel | undefined = undefined> = ButtonModernController<TModel> & {
defaults: () => UnsafeVillageButtonModelDefaults;
};
export type FestivalButtonController = VillageButtonController<UnsafeFestivalButtonModel> & {
fetchModel: (options: unknown) => UnsafeFestivalButtonModel;
_newLink: (holdQuantity: number) => Link;
updateVisible: (model: UnsafeFestivalButtonModel) => void;
hasMultipleResources: (amt: number) => boolean;
};
export type FestivalButton = ButtonModern<UnsafeFestivalButtonOptions> & {
renderLinks: () => void;
x100?: Link;
x10?: Link;
update: () => void;
};
export type Village = Tab & {
tdTop: HTMLTableCellElement | null;
advModeButtons: Array<unknown>;
huntBtn: ButtonModern<UnsafeHuntButtonOptions>;
festivalBtn: FestivalButton;
optimizeJobsBtn: ButtonModern<UnsafeOptimizeJobsButtonOptions>;
promoteKittensBtn: ButtonModern<UnsafePromoteKittensButtonOptions>;
redeemGiftBtn: ButtonModern<UnsafeRedeemGiftButtonOptions>;
new (tabName: unknown, game: GamePage): Village;
createJobBtn: (job: Job, game: GamePage) => JobButton;
createLoadoutBtn: (loadout: Loadout, game: GamePage) => LoadoutButton;
render: (tabContainer?: HTMLElement) => void;
buttons?: Array<unknown>;
jobsPanel?: Panel;
createLoadoutHref?: HTMLAnchorElement;
mapPanel?: Map;
mapWgt?: MapOverviewWgt;
statisticsPanel?: Panel;
advVillageTable?: HTMLTableElement;
happinessStats?: HTMLTableCellElement;
censusPanel?: CensusPanel;
update: () => void;
updateTab: () => void;
evaluateLocks: () => boolean;
getVillageTitle: () => string;
skillToText: (value: number) => string;
sendHunterSquad: () => void;
holdFestival: (amt: number) => void;
requestCensusRefresh: () => void;
rand: (ratio: number) => number;
};
export type UnsafeJob = {
name: Job;
title: string;
description: string;
flavor?: string;
unlocked: boolean;
value: number;
modifiers: Record<string, number>;
calculateEffects?: (self: UnsafeJob, game: GamePage) => void;
evaluateLocks?: (game: GamePage) => boolean;
};
export type UnsafeTrait = {
name: string;
title: string;
};
export type UnsafeBiome = {
name: string;
title: string;
desc: string;
terrainPenalty: number;
faunaPenalty: number;
unlocked: boolean;
};
export type UnsafeUpgradeExplorersButtonOptions = {
name: string;
description: string;
handler: AnyFunction;
prices: Array<Price>;
controller: UpgradeExplorersController;
};
export type UnsafeUpgradeHQButtonOptions = {
name: string;
description: string;
handler: AnyFunction;
prices: Array<Price>;
controller: UpgradeHQController;
};
export type UnsafeClearJobsButtonOptions = {
name: string;
description: string;
handler: AnyFunction;
controller: ButtonModernController;
};
export type UnsafeHuntButtonOptions = {
name: string;
description: string;
handler: AnyFunction;
prices: Array<Price>;
controller: VillageButtonController;
};
export type UnsafeFestivalButtonOptions = {
name: string;
description: string;
handler: AnyFunction;
prices: Array<Price>;
controller: FestivalButtonController;
};
export type UnsafeOptimizeJobsButtonOptions = {
name: string;
description: string;
handler: AnyFunction;
controller: VillageButtonController;
};
export type UnsafePromoteKittensButtonOptions = {
name: string;
description: string;
handler: AnyFunction;
controller: VillageButtonController;
};
export type UnsafeRedeemGiftButtonOptions = {
name: string;
description: string;
handler: AnyFunction;
controller: VillageButtonController;
};
export type UnsafeBiomeButtonOptions = {
id: Biome;
name: string;
description: string;
prices: Array<Price>;
controller: BiomeBtnController;
};
export type UnsafeLoadoutButtonOptions = {
name: string;
loadout: Loadout;
controller: LoadoutButtonController;
};
export type UnsafeJobButtonOptions = {
name: string;
job: Job;
controller: JobButtonController;
};
export type UnsafeBiomeBtnModel = UnsafeButtonModernModel & {
biome: UnsafeBiome;
};
export type UnsafeUpgradeHQBtnModel = UnsafeBuildingBtnModernModel & {
simplePrices: boolean;
};
export type UnsafeUpgradeExplorersBtnModel = UnsafeButtonModernModel & {
simplePrices: boolean;
};
export type UnsafeLoadoutButtonModelDefaults = {
tooltipName: boolean;
} & UnsafeButtonModernModelDefaults;
export type UnsafeLoadoutButtonModel<TModelOptions extends Record<string, unknown> | undefined = undefined> = UnsafeLoadoutButtonModelDefaults & UnsafeButtonModernModel<TModelOptions> & {
editLinks: Array<Link>;
pinLink: Link;
};
export type UnsafeJobButtonModelDefaults = {
tooltipName: boolean;
} & UnsafeButtonModernModelDefaults;
export type UnsafeJobButtonModel<TModelOptions extends Record<string, unknown> | undefined = undefined> = UnsafeJobButtonModelDefaults & UnsafeButtonModernModel<TModelOptions> & {
job: UnsafeJob;
unassignLinks: Array<Link>;
assignLinks: Array<Link>;
};
export type UnsafeVillageButtonModelDefaults = {
simplePrices: boolean;
hasResourceHover: boolean;
} & UnsafeButtonModernModelDefaults;
export type UnsafeFestivalButtonModel<TModelOptions extends Record<string, unknown> | undefined = undefined> = UnsafeVillageButtonModelDefaults & UnsafeButtonModernModel<TModelOptions> & {
x10Link: Link;
x100Link: Link;
};
//# sourceMappingURL=village.d.ts.map