scan, privacy answers and credentials from a second game's first release (lessons 35-37): review-prompt needs rating context, not a bare "rate"; account signals skip import lines and module paths, config-only accounts say "from config"; accounts.inApp without deletion code stays a medium 5.1.1(v) finding; privacy-manifest --propose builds NSPrivacyCollectedDataTypes from appPrivacy.types and check warns on an empty list; appPrivacy.types is authoritative in the App Privacy sheet (unlisted = not collected), ad / support / AR types default to not collected without tracking or ad SDKs; Play advertising ID from SDKs, the AD_ID permission, app-ads.txt or the flag, never from a Device ID alone; scan.ignore[].evidence and warnings for entries that match nothing; empty credentials template, placeholder values count as missing (check, doctor)

This commit is contained in:
CRTkafa 2026-10-13 05:39:09 +08:00
parent 86cd79dd45
commit 1366e7e231
34 changed files with 881 additions and 71 deletions

View file

@ -0,0 +1,7 @@
import { registry } from './registry';
export class Farm { level = 1 }
export class Mill { level = 1 }
registry.register('farm', Farm);
registry.register('mill', Mill);

View file

@ -0,0 +1,11 @@
export const bonus = { gen: (r: number) => 1 + r * 0.1 };
export const F = {
genRate: (lv: number, mult: number) => lv * 2 * mult,
};
export function tick(f: typeof F, lv = 1, r = 0): number {
const rate = F.genRate(lv, bonus.gen(r));
const frameRate = 60; // bonus coins drop every second
const exchangeRate = 10; // coins per gem
return rate * frameRate / exchangeRate;
}

View file

@ -0,0 +1,10 @@
import './buildings/register';
import { Preferences } from '@capacitor/preferences';
import { F, tick } from './economy';
export async function boot(): Promise<void> {
const saved = await Preferences.get({ key: 'farm' });
const installId = saved.value ?? crypto.randomUUID();
await Preferences.set({ key: 'farm', value: installId });
setInterval(() => tick(F), 1000);
}