diff --git a/src/app.js b/src/app.js index 190c028..e6cb8ef 100644 --- a/src/app.js +++ b/src/app.js @@ -568,45 +568,22 @@ class App{ }); }); - const records = this.#life.getRecord(); - const s = (type, func)=>{ - const value = func(records.map(({[type]:v})=>v)); + const summaryData = this.#life.getSummary(); + const format = (discription, type)=>{ + const value = summaryData[type]; const { judge, grade } = summary(type, value); - return { judge, grade, value }; + return `
  • ${discription}:${value} ${judge}
  • `; }; - judge.append([ - (()=>{ - const { judge, grade, value } = s('CHR', max); - return `
  • 颜值:${value} ${judge}
  • ` - })(), - (()=>{ - const { judge, grade, value } = s('INT', max); - return `
  • 智力:${value} ${judge}
  • ` - })(), - (()=>{ - const { judge, grade, value } = s('STR', max); - return `
  • 体质:${value} ${judge}
  • ` - })(), - (()=>{ - const { judge, grade, value } = s('MNY', max); - return `
  • 家境:${value} ${judge}
  • ` - })(), - (()=>{ - const { judge, grade, value } = s('SPR', max); - return `
  • 快乐:${value} ${judge}
  • ` - })(), - (()=>{ - const { judge, grade, value } = s('AGE', max); - return `
  • 享年:${value} ${judge}
  • ` - })(), - (()=>{ - const m = type=>max(records.map(({[type]: value})=>value)); - const value = Math.floor(sum(m('CHR'), m('INT'), m('STR'), m('MNY'), m('SPR'))*2 + m('AGE')/2); - const { judge, grade } = summary('SUM', value); - return `
  • 总评:${value} ${judge}
  • ` - })(), - ].join('')); + judge.append(` + ${format('颜值', 'CHR')} + ${format('智力', 'INT')} + ${format('体质', 'STR')} + ${format('家境', 'MNY')} + ${format('快乐', 'SPR')} + ${format('享年', 'AGE')} + ${format('总评', 'SUM')} + `); } }, } diff --git a/src/life.js b/src/life.js index e328f31..c0abd4f 100644 --- a/src/life.js +++ b/src/life.js @@ -29,7 +29,7 @@ class Life { this.#triggerTalents = {}; this.#property.restart(allocation); this.doTalent(); - this.#property.record(); + this.#property.restartLastStep(); } getTalentAllocationAddition(talents) { @@ -45,7 +45,6 @@ class Life { const talentContent = this.doTalent(talent); const eventContent = this.doEvent(this.random(event)); - this.#property.record(); const isEnd = this.#property.isEnd(); @@ -104,15 +103,27 @@ class Life { } talentRandom() { - return this.#talent.talentRandom(JSON.parse(localStorage.extendTalent||'null')); + return this.#talent.talentRandom(this.getLastExtendTalent()); } talentExtend(talentId) { - localStorage.extendTalent = JSON.stringify(talentId); + this.#property.set(this.#property.TYPES.EXT, talentId); } - getRecord() { - return this.#property.getRecord(); + getLastExtendTalent() { + return this.#property.get(this.#property.TYPES.EXT); + } + + getSummary() { + return { + AGE: this.#property.get(this.#property.TYPES.HAGE), + CHR: this.#property.get(this.#property.TYPES.HCHR), + INT: this.#property.get(this.#property.TYPES.HINT), + STR: this.#property.get(this.#property.TYPES.HSTR), + MNY: this.#property.get(this.#property.TYPES.HMNY), + SPR: this.#property.get(this.#property.TYPES.HSPR), + SUM: this.#property.get(this.#property.TYPES.SUM), + }; } getLastRecord() { diff --git a/src/property.js b/src/property.js index b5d90ad..7ee7199 100644 --- a/src/property.js +++ b/src/property.js @@ -1,9 +1,10 @@ -import { clone } from './functions/util.js'; +import { max, min, sum, clone } from './functions/util.js'; class Property { constructor() {} TYPES = { + // 本局 AGE: "AGE", // 年龄 age AGE CHR: "CHR", // 颜值 charm CHR INT: "INT", // 智力 intelligence INT @@ -14,11 +15,33 @@ class Property { TLT: "TLT", // 天赋 talent TLT EVT: "EVT", // 事件 event EVT TMS: "TMS", // 次数 times TMS + + // Auto calc + LAGE: "LAGE", // 最低年龄 Low Age + HAGE: "HAGE", // 最高年龄 High Age + LCHR: "LCHR", // 最低颜值 Low Charm + HCHR: "HCHR", // 最高颜值 High Charm + LINT: "LINT", // 最低智力 Low Intelligence + HINT: "HINT", // 最高智力 High Intelligence + LSTR: "LSTR", // 最低体质 Low Strength + HSTR: "HSTR", // 最高体质 High Strength + LMNY: "LMNY", // 最低家境 Low Money + HMNY: "HMNY", // 最高家境 High Money + LSPR: "LSPR", // 最低快乐 Low Spirit + HSPR: "HSPR", // 最高快乐 High Spirit + + SUM: "SUM", // 总评 summary SUM + + EXT: "EXT", // 继承天赋 + + // 总计 + // Achievement Total + ATLT: "ATLT", // 拥有过的天赋 Achieve Talent + AEVT: "AEVT", // 触发过的事件 Achieve Event }; #ageData; #data; - #record; initial({age}) { @@ -46,18 +69,49 @@ class Property { restart(data) { this.#data = { [this.TYPES.AGE]: -1, + [this.TYPES.CHR]: 0, [this.TYPES.INT]: 0, [this.TYPES.STR]: 0, [this.TYPES.MNY]: 0, [this.TYPES.SPR]: 0, + [this.TYPES.LIF]: 1, + [this.TYPES.TLT]: [], [this.TYPES.EVT]: [], + + [this.TYPES.LAGE]: Infinity, + [this.TYPES.LCHR]: Infinity, + [this.TYPES.LINT]: Infinity, + [this.TYPES.LSTR]: Infinity, + [this.TYPES.LSPR]: Infinity, + [this.TYPES.LMNY]: Infinity, + + [this.TYPES.HAGE]: -Infinity, + [this.TYPES.HCHR]: -Infinity, + [this.TYPES.HINT]: -Infinity, + [this.TYPES.HSTR]: -Infinity, + [this.TYPES.HMNY]: -Infinity, + [this.TYPES.HSPR]: -Infinity, }; for(const key in data) this.change(key, data[key]); - this.#record = []; + } + + restartLastStep() { + this.#data[this.TYPES.LAGE] = this.get(this.TYPES.AGE); + this.#data[this.TYPES.LCHR] = this.get(this.TYPES.CHR); + this.#data[this.TYPES.LINT] = this.get(this.TYPES.INT); + this.#data[this.TYPES.LSTR] = this.get(this.TYPES.STR); + this.#data[this.TYPES.LSPR] = this.get(this.TYPES.SPR); + this.#data[this.TYPES.LMNY] = this.get(this.TYPES.MNY); + this.#data[this.TYPES.HAGE] = this.get(this.TYPES.AGE); + this.#data[this.TYPES.HCHR] = this.get(this.TYPES.CHR); + this.#data[this.TYPES.HINT] = this.get(this.TYPES.INT); + this.#data[this.TYPES.HSTR] = this.get(this.TYPES.STR); + this.#data[this.TYPES.HMNY] = this.get(this.TYPES.MNY); + this.#data[this.TYPES.HSPR] = this.get(this.TYPES.SPR); } get(prop) { @@ -72,11 +126,61 @@ class Property { case this.TYPES.TLT: case this.TYPES.EVT: return clone(this.#data[prop]); + case this.TYPES.LAGE: + case this.TYPES.LCHR: + case this.TYPES.LINT: + case this.TYPES.LSTR: + case this.TYPES.LMNY: + case this.TYPES.LSPR: + return min( + this.#data[prop], + this.get(this.fallback(prop)) + ); + case this.TYPES.HAGE: + case this.TYPES.HCHR: + case this.TYPES.HINT: + case this.TYPES.HSTR: + case this.TYPES.HMNY: + case this.TYPES.HSPR: + return max( + this.#data[prop], + this.get(this.fallback(prop)) + ); + case this.TYPES.SUM: + const HAGE = this.get(this.TYPES.HAGE); + const HCHR = this.get(this.TYPES.HCHR); + const HINT = this.get(this.TYPES.HINT); + const HSTR = this.get(this.TYPES.HSTR); + const HMNY = this.get(this.TYPES.HMNY); + const HSPR = this.get(this.TYPES.HSPR); + return Math.floor(sum(HCHR, HINT, HSTR, HMNY, HSPR)*2 + HAGE/2); case this.TYPES.TMS: - return JSON.parse(localStorage.times||'0') || 0; + return this.lsget('times') || 0; + case this.TYPES.EXT: + return this.lsget('extendTalent') || null; + case this.TYPES.ATLT: + case this.TYPES.AEVT: + return this.lsget(prop) || []; default: return 0; } } + fallback(prop) { + switch(prop) { + case this.TYPES.LAGE: + case this.TYPES.HAGE: return this.TYPES.AGE; + case this.TYPES.LCHR: + case this.TYPES.HCHR: return this.TYPES.CHR; + case this.TYPES.LINT: + case this.TYPES.HINT: return this.TYPES.INT; + case this.TYPES.LSTR: + case this.TYPES.HSTR: return this.TYPES.STR; + case this.TYPES.LMNY: + case this.TYPES.HMNY: return this.TYPES.MNY; + case this.TYPES.LSPR: + case this.TYPES.HSPR: return this.TYPES.SPR; + default: return; + } + } set(prop, value) { switch(prop) { @@ -89,17 +193,21 @@ class Property { case this.TYPES.LIF: case this.TYPES.TLT: case this.TYPES.EVT: - this.#data[prop] = clone(value); + this.hl(prop, this.#data[prop] = clone(value)); + this.achieve(prop, value); return; case this.TYPES.TMS: - localStorage.times = JSON.stringify(parseInt(value) || 0); + this.lsset('times', parseInt(value) || 0); return; + case this.TYPES.EXT: + this.lsset('extendTalent', value); + return default: return; } } - record() { - this.#record.push({ + getLastRecord() { + return clone({ [this.TYPES.AGE]: this.get(this.TYPES.AGE), [this.TYPES.CHR]: this.get(this.TYPES.CHR), [this.TYPES.INT]: this.get(this.TYPES.INT), @@ -109,14 +217,6 @@ class Property { }); } - getRecord() { - return clone(this.#record); - } - - getLastRecord() { - return clone(this.#record[this.#record.length - 1]); - } - change(prop, value) { if(Array.isArray(value)) { for(const v of value) @@ -131,7 +231,7 @@ class Property { case this.TYPES.MNY: case this.TYPES.SPR: case this.TYPES.LIF: - this.#data[prop] += Number(value); + this.hl(prop, this.#data[prop] += Number(value)); return; case this.TYPES.TLT: case this.TYPES.EVT: @@ -141,6 +241,7 @@ class Property { if(index!=-1) v.splice(index,1); } if(!v.includes(value)) v.push(value); + this.achieve(prop, value); return; case this.TYPES.TMS: this.set( @@ -172,6 +273,54 @@ class Property { return clone(this.#ageData[age]); } + hl(prop, value) { + let keys; + switch(prop) { + case this.TYPES.AGE: keys = [this.TYPES.LAGE, this.TYPES.HAGE]; break; + case this.TYPES.CHR: keys = [this.TYPES.LCHR, this.TYPES.HCHR]; break; + case this.TYPES.INT: keys = [this.TYPES.LINT, this.TYPES.HINT]; break; + case this.TYPES.STR: keys = [this.TYPES.LSTR, this.TYPES.HSTR]; break; + case this.TYPES.MNY: keys = [this.TYPES.LMNY, this.TYPES.HMNY]; break; + case this.TYPES.SPR: keys = [this.TYPES.LSPR, this.TYPES.HSPR]; break; + default: return; + } + const [l, h] = keys; + this.#data[l] = min(this.#data[l], value); + this.#data[h] = max(this.#data[h], value); + } + + achieve(prop, newData = []) { + let key; + switch(prop) { + case this.TYPES.TLT: key = this.TYPES.ATLT; break; + case this.TYPES.EVT: key = this.TYPES.AEVT; break; + default: return; + } + const lastData = this.lsget(key) || []; + this.lsset( + key, + Array.from( + new Set( + lastData + .concat(newData) + .flat() + ) + ) + ) + } + + lsget(key) { + const data = localStorage.getItem(key); + if(data === null) return; + return JSON.parse(data); + } + + lsset(key, value) { + localStorage.setItem( + key, + JSON.stringify(value) + ); + } } export default Property; \ No newline at end of file