math-game-sdk 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/math-game-sdk.js +12 -0
  2. package/package.json +11 -0
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Math Game SDK v3
3
+ *
4
+ * Namespaces: bridge · math · utils · geo · ease
5
+ *
6
+ * Usage:
7
+ * <script src="https://cdn.jsdelivr.net/npm/math-game-sdk@3/math-game-sdk.js"></script>
8
+ * MathGameSDK.bridge.onReady(() => { ... })
9
+ * const qs = MathGameSDK.math.generate({ type: "addition", count: 5 })
10
+ * MathGameSDK.utils.shuffle([1,2,3,4])
11
+ */
12
+ "use strict";(()=>{var J=Object.defineProperty,X=Object.defineProperties;var ee=Object.getOwnPropertyDescriptors;var y=Object.getOwnPropertySymbols;var re=Object.prototype.hasOwnProperty,ne=Object.prototype.propertyIsEnumerable;var M=(e,r,n)=>r in e?J(e,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[r]=n,T=(e,r)=>{for(var n in r||(r={}))re.call(r,n)&&M(e,n,r[n]);if(y)for(var n of y(r))ne.call(r,n)&&M(e,n,r[n]);return e},g=(e,r)=>X(e,ee(r));var te={1:["addition","subtraction","comparison","missing-number"],2:["addition","subtraction","multiplication","division","comparison","missing-number","fractions"],3:["addition","subtraction","multiplication","division","comparison","missing-number","fractions","word-problem"]},oe={1:[1,10],2:[1,20],3:[10,99]};function a(e,r){return Math.floor(Math.random()*(r-e+1))+e}function A(e){return e[Math.floor(Math.random()*e.length)]}function ie(e,r){let n=a(r[0],r[1]),t=a(r[0],r[1]);return{type:"addition",prompt:`${n} + ${t} = ?`,answer:n+t,difficulty:e}}function ue(e,r){let n=a(r[0],r[1]),t=a(r[0],r[1]);return n<t&&([n,t]=[t,n]),{type:"subtraction",prompt:`${n} - ${t} = ?`,answer:n-t,difficulty:e}}function ae(e,r){let n=Math.min(r[1],e===2?9:12),t=a(r[0],n),o=a(2,9);return{type:"multiplication",prompt:`${t} \xD7 ${o} = ?`,answer:t*o,difficulty:e}}function ce(e,r){let n=e===2?5:9,t=e===2?9:12,o=a(2,n),i=a(1,t);return{type:"division",prompt:`${o*i} \xF7 ${o} = ?`,answer:i,difficulty:e}}function se(e,r){let n=a(r[0],r[1]),t=a(r[0],r[1]);for(;t===n;)t=a(r[0],r[1]);let o=Math.max(n,t);return{type:"comparison",prompt:`S\u1ED1 n\xE0o l\u1EDBn h\u01A1n: ${n} hay ${t}?`,answer:o,difficulty:e}}function me(e,r){if(e===3){let i=a(2,9),u=a(1,9);return{type:"missing-number",prompt:`${i*u} \xF7 ? = ${u}`,answer:i,difficulty:e}}let n=a(r[0],r[1]),t=a(1,r[1]),o=n+t;return{type:"missing-number",prompt:`${n} + ? = ${o}`,answer:t,difficulty:e}}var pe=[{prompt:"1/2 c\u1EE7a 10 = ?",answer:5},{prompt:"1/2 c\u1EE7a 8 = ?",answer:4},{prompt:"1/4 c\u1EE7a 12 = ?",answer:3},{prompt:"1/3 c\u1EE7a 9 = ?",answer:3},{prompt:"1/2 c\u1EE7a 6 = ?",answer:3},{prompt:"1/4 c\u1EE7a 8 = ?",answer:2},{prompt:"1/3 c\u1EE7a 12 = ?",answer:4},{prompt:"1/5 c\u1EE7a 10 = ?",answer:2},{prompt:"3/4 c\u1EE7a 8 = ?",answer:6},{prompt:"2/3 c\u1EE7a 9 = ?",answer:6}],fe=[{prompt:"1/2 + 1/4 = ? (t\xEDnh theo ph\u1EA7n t\u01B0)",answer:.75},{prompt:"1/3 + 1/3 = ? (t\xEDnh theo ph\u1EA7n ba)",answer:.667},{prompt:"3/4 - 1/4 = ? (t\xEDnh theo ph\u1EA7n t\u01B0)",answer:.5},{prompt:"1/2 c\u1EE7a 20 = ?",answer:10},{prompt:"3/4 c\u1EE7a 12 = ?",answer:9},{prompt:"2/5 c\u1EE7a 10 = ?",answer:4},{prompt:"3/5 c\u1EE7a 15 = ?",answer:9},{prompt:"1/4 c\u1EE7a 20 = ?",answer:5},{prompt:"5/6 c\u1EE7a 12 = ?",answer:10},{prompt:"2/3 c\u1EE7a 15 = ?",answer:10}];function le(e){let n=A(e===2?pe:fe);return{type:"fractions",prompt:n.prompt,answer:n.answer,difficulty:e}}var be=[(e,r)=>({prompt:`B\u1EA1n c\xF3 ${e} qu\u1EA3 t\xE1o, mua th\xEAm ${r} qu\u1EA3. H\u1ECFi c\xF3 t\u1EA5t c\u1EA3 m\u1EA5y qu\u1EA3?`,answer:e+r}),(e,r)=>({prompt:`Trong h\u1ED9p c\xF3 ${e+r} b\xFAt ch\xEC, d\xF9ng h\u1EBFt ${r} c\xE1i. C\xF2n l\u1EA1i m\u1EA5y c\xE1i?`,answer:e}),(e,r)=>({prompt:`M\u1ED9t h\u1ED9p c\xF3 ${r} c\xE1i b\xE1nh. Mua ${e} h\u1ED9p th\xEC t\u1EA5t c\u1EA3 c\xF3 m\u1EA5y c\xE1i?`,answer:e*r}),(e,r)=>({prompt:`C\xF3 ${e*r} qu\u1EA3 cam chia \u0111\u1EC1u cho ${r} b\u1EA1n. M\u1ED7i b\u1EA1n \u0111\u01B0\u1EE3c m\u1EA5y qu\u1EA3?`,answer:e}),(e,r)=>({prompt:`M\u1ED9t l\u1EDBp c\xF3 ${e} b\u1EA1n nam v\xE0 ${r} b\u1EA1n n\u1EEF. H\u1ECFi l\u1EDBp c\xF3 m\u1EA5y b\u1EA1n?`,answer:e+r}),(e,r)=>({prompt:`B\u1EA1n c\xF3 ${e+r} vi\xEAn bi, cho b\u1EA1n b\xE8 ${r} vi\xEAn. C\xF2n l\u1EA1i m\u1EA5y vi\xEAn?`,answer:e})];function de(e,r){let n=A(be),t=a(r[0],Math.min(r[1],15)),o=a(2,Math.min(r[1]<20?r[1]:12,9)),{prompt:i,answer:u}=n(t,o);return{type:"word-problem",prompt:i,answer:u,difficulty:e}}function v(e){var u,s,c;let{type:r}=e,n=(u=e.difficulty)!=null?u:1,t=(s=e.count)!=null?s:5;if(t>100)throw new Error("MathGameSDK: count exceeds maximum of 100");if(r==="fractions"&&n<2)throw new Error("MathGameSDK: fractions requires difficulty >= 2 (grade 2+)");if(r==="word-problem"&&n<3)throw new Error("MathGameSDK: word-problem requires difficulty >= 3 (grade 3+)");if(!te[n].includes(r))throw new Error(`MathGameSDK: type '${r}' is not available at difficulty ${n}`);let o=(c=e.range)!=null?c:oe[n],i=[];for(let w=0;w<t;w++)switch(r){case"addition":i.push(ie(n,o));break;case"subtraction":i.push(ue(n,o));break;case"multiplication":i.push(ae(n,o));break;case"division":i.push(ce(n,o));break;case"comparison":i.push(se(n,o));break;case"missing-number":i.push(me(n,o));break;case"fractions":i.push(le(n));break;case"word-problem":i.push(de(n,o));break}return i}function h(e,r){return{correct:Math.abs(r-e.answer)<.001,correctAnswer:e.answer}}function x(e,r){let n=e.map((o,i)=>{var u;return h(o,(u=r[i])!=null?u:NaN)});return{correct:n.filter(o=>o.correct).length,total:e.length,results:n}}function E(e=100){if(e<=0)throw new Error("MathGameSDK: maxScore must be > 0");let r=0;return{add(n=10){r=Math.min(e,r+n)},subtract(n=5){r=Math.max(0,r-n)},get(){return r},percentage(){return Math.round(r/e*100)},reset(){r=0}}}function _(e){if(e<=0)throw new Error("MathGameSDK: timer duration must be > 0");let r=e,n="idle",t=null,o=[],i=[];function u(){t!==null&&(clearInterval(t),t=null)}function s(){r-=1,o.forEach(c=>c(r)),r<=0&&(u(),n="ended",i.forEach(c=>c()))}return{start(){n==="running"||n==="ended"||(n="running",t=setInterval(s,1e3))},stop(){u(),r=e,n="idle"},pause(){n==="running"&&(u(),n="paused")},onTick(c){o.push(c)},onEnd(c){i.push(c)},get remaining(){return r}}}function k(e){for(let r=e.length-1;r>0;r--){let n=Math.floor(Math.random()*(r+1)),t=e[r];e[r]=e[n],e[n]=t}return e}function D(e,r){if(r<0||r>e)return 0;if(r===0||r===e)return 1;let n=Math.min(r,e-r),t=1;for(let o=0;o<n;o++)t=t*(e-o)/(o+1);return Math.round(t)}function S(e,r){if(r<0||r>e)return 0;let n=1;for(let t=0;t<r;t++)n*=e-t;return n}function R(e,r){let n=[];function t(o,i){if(i.length===r){n.push([...i]);return}for(let u=o;u<e;u++)i.push(u),t(u+1,i),i.pop()}return t(0,[]),n}function P(e,r,n=[.5,.8]){let t=r>0?e/r:0;return t>=n[1]?3:t>=n[0]?2:1}function $(e,r,n=null){let t=Array.from({length:e},()=>Array(r).fill(n));return{get(o,i){return t[o][i]},set(o,i,u){t[o][i]=u},fill(o){for(let i=0;i<e;i++)for(let u=0;u<r;u++)t[i][u]=o},count(o=i=>i!==null){let i=0;for(let u of t)for(let s of u)o(s)&&i++;return i},isFull(){return t.every(o=>o.every(i=>i!==null))},toArray(){return t.map(o=>[...o])},forEach(o){for(let i=0;i<e;i++)for(let u=0;u<r;u++)o(t[i][u],i,u)}}}function b(e,r){let n=e.x-r.x,t=e.y-r.y;return Math.sqrt(n*n+t*t)<=r.radius}function G(e,r,n){let t=b(e,r),o=b(e,n);return t&&o?"AB":t?"A":o?"B":"outside"}function q(e,r,n,t){let o=n-e,i=t-r;return Math.sqrt(o*o+i*i)}function C(e){return e*(Math.PI/180)}function I(e){return e*(180/Math.PI)}function Q(e,r,n){return Math.max(r,Math.min(n,e))}function O(e,r,n){return(r-e)*n+e}function H(e,r,n){let t=n-r;return((e-r)%t+t)%t+r}function K(e,r){return Math.floor(Math.random()*(r-e+1)+e)}function L(e){return e[Math.floor(Math.random()*e.length)]}function F(e,r,n){return n===r?0:(e-r)/(n-r)}function N(e){return e}function B(e){return e*e}function Y(e){return e*(2-e)}function Z(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375}function W(e){return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e-.1)*5*Math.PI)+1}var l=[],m={},he=0,d=!1,U=new Map,f=!1;setTimeout(()=>{if(!d){f=!0;for(let e in m){let r=m[e];delete m[e],r.resolve(null)}d=!0,l.forEach(e=>e()),l.length=0}},800);window.addEventListener("message",e=>{var n,t,o,i,u,s;let r=e.data;if(!(!r||typeof r.type!="string"))switch(r.type){case"MATH_GAME_ACK":d=!0,f=!1,l.forEach(c=>c()),l.length=0;break;case"MATH_GAME_PLAYER_INFO":j((n=r.payload)==null?void 0:n.requestId,(o=(t=r.payload)==null?void 0:t.name)!=null?o:"");break;case"MATH_GAME_STATE_DATA":j((i=r.payload)==null?void 0:i.requestId,(s=(u=r.payload)==null?void 0:u.data)!=null?s:null);break}});function p(e,r){try{window.parent.postMessage({type:e,payload:r},"*")}catch(n){}}function j(e,r){if(e===void 0)return;let n=m[e];n&&(delete m[e],n.resolve(r))}function V(e,r){return new Promise((n,t)=>{let o=++he;m[o]={resolve:n,reject:t},setTimeout(()=>{m[o]&&(delete m[o],t(new Error(`MathGameSDK: request timed out (${e})`)))},5e3),p(e,g(T({},r),{requestId:o}))})}var z={bridge:{reportScore(e,r){p("MATH_GAME_SCORE",{score:e,maxScore:r})},reportProgress(e,r){p("MATH_GAME_PROGRESS",{current:e,total:r})},reportComplete(){p("MATH_GAME_COMPLETE",{})},getPlayerName(){return f?Promise.resolve(""):V("MATH_GAME_REQUEST_PLAYER",{}).then(e=>typeof e=="string"?e:"",()=>"")},onReady(e){d?e():l.push(e)},saveState(e,r){if(f){U.set(e,r);return}p("MATH_GAME_SAVE_STATE",{key:e,data:r})},loadState(e){var r;return f?Promise.resolve((r=U.get(e))!=null?r:null):V("MATH_GAME_LOAD_STATE",{key:e}).catch(()=>null)}},math:{generate:v,checkAnswer:h,checkAnswers:x,combination:D,permutation:S,getAllCombinations:R,calculateStars:P,distance:q,degToRad:C,radToDeg:I},utils:{shuffle:k,createScoreTracker:E,createTimer:_,createGrid:$,clamp:Q,lerp:O,wrap:H,randomInt:K,randomPick:L,percent:F},geo:{isPointInCircle:b,determineZone:G},ease:{linear:N,quadIn:B,quadOut:Y,bounceOut:Z,elasticOut:W}};p("MATH_GAME_READY",{});window.MathGameSDK=z;var Ke=z;})();
package/package.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "math-game-sdk",
3
+ "version": "3.0.0",
4
+ "description": "Math Game SDK v3 — utility library for building HTML math games",
5
+ "main": "math-game-sdk.js",
6
+ "files": [
7
+ "math-game-sdk.js"
8
+ ],
9
+ "keywords": ["math", "game", "sdk", "education"],
10
+ "license": "MIT"
11
+ }