commit 34122811dd4f115b6dc14248377a76c9d5d086a2 Author: Mykyta Slobodianiuk Date: Tue Jun 2 11:07:49 2026 +0300 "init" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57f1443 --- /dev/null +++ b/.gitignore @@ -0,0 +1,153 @@ + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https: //nodejs.org/api/report.html) +report.[ + 0-9 +]*.[ + 0-9 +]*.[ + 0-9 +]*.[ + 0-9 +]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https: //gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https: //bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https: //nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https: //snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https: //parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https: //nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + + +.vscode/ +.vs/ + +package-lock.json + +.other_files/ +zip/ +output/js/ +temp/ +export/ +dist/ +export_test/ +extra_compress/ +preview_dist/ +build/ diff --git a/package.json b/package.json new file mode 100644 index 0000000..e5f971a --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "my-game-playable", + "version": "0.1.0", + "description": "24play playable", + "publishConfig": { + "access": "restricted" + }, + "scripts": { + "start": "vite", + "export": "node templateLibs/export.cjs", + "preview": "vite preview", + "build": "node templateLibs/zip.cjs", + "update": "npm i @24tools/ads_common@latest @24tools/playable_template@latest && node templateLibs/update.cjs" + }, + "dependencies": { + "@24tools/ads_common": "^0.15.6", + "@24tools/playable_template": "^0.15.5", + "@tweenjs/tween.js": "^25.0.0", + "bytebrew-web-sdk": "^1.0.1", + "cannon-es": "^0.20.0", + "cannon-es-debugger": "^1.0.0", + "howler": "^2.2.4", + "nipplejs": "^1.0.4", + "three": "^0.184.0" + }, + "devDependencies": { + "@types/howler": "^2.2.13", + "@types/three": "^0.184.1", + "rollup": "^4.61.0", + "typescript": "^6.0.3", + "vite": "^6.4.3" + } +} diff --git a/src/configUIParams/analytics.ts b/src/configUIParams/analytics.ts new file mode 100644 index 0000000..2ed3e68 --- /dev/null +++ b/src/configUIParams/analytics.ts @@ -0,0 +1,50 @@ +import { ConfigUiParamsCategories } from "@24tools/ads_common"; + +export const analytics: ConfigUiParamsCategories[] = [ + { + name: "Analytics params", + id: "analytics_params", + params: [ + { + id: "bite_brew", + name: "Byte Brew", + type: "group", + params: [ + { + name: "Enabled", + id: "isAnalyticsBB_Enabled", + type: "bool", + values: [false], + }, + { + name: "App ID", + id: "AnalyticsBB_AppID", + type: "string", + values: [""], + uneditable: true, + dontIncludeToLocalisation: true, + disable: ["isAnalyticsBB_Enabled", "values !== true"], + }, + { + name: "Key", + id: "AnalyticsBB_Key", + type: "string", + values: [""], + uneditable: true, + dontIncludeToLocalisation: true, + disable: ["isAnalyticsBB_Enabled", "values !== true"], + }, + { + name: "version", + id: "AppVersion", + type: "string", + values: ["1.0.0"], + dontIncludeToLocalisation: true, + disable: ["isAnalyticsBB_Enabled", "values !== true"], + regExp: "^d+.d+.d+$", + }, + ], + }, + ], + }, +]; diff --git a/src/configUIParams/configUIParams.ts b/src/configUIParams/configUIParams.ts new file mode 100644 index 0000000..a61e27d --- /dev/null +++ b/src/configUIParams/configUIParams.ts @@ -0,0 +1,14 @@ +import { ConfigUiParamsCategories } from "@24tools/ads_common"; +import { sounds } from "./sounds"; +//@ts-ignore +import { analytics } from "./analytics"; +//@ts-ignore +import { installBanner } from "./installBanner"; +import { globalSettings } from "./globalSettings"; + +export const configUIParams: ConfigUiParamsCategories[][] = [ + analytics, + installBanner, + globalSettings, + sounds, +]; diff --git a/src/configUIParams/globalSettings.ts b/src/configUIParams/globalSettings.ts new file mode 100644 index 0000000..74a1702 --- /dev/null +++ b/src/configUIParams/globalSettings.ts @@ -0,0 +1,144 @@ +import { ConfigUiParamsCategories } from "@24tools/ads_common"; + +export const globalSettings: ConfigUiParamsCategories[] = [ + { + id: "global", + name: "Scene settings", + params: [ + { + id: "light_intensity", + name: "Light intensity", + type: "float", + values: [ + 0, + 5, + 1 + ] + }, + { + id: "light_color", + name: "Main light color", + type: "color", + values: [ + "0xFFFFFF" + ] + }, + { + id: "camera_fov_p", + name: "Camera FOV (portrait)", + type: "int", + values: [ + 30, + 150, + 60 + ] + }, + { + id: "camera_position_p", + name: "Camera position (portrait)", + type: "float", + array: true, + visible: "position", + values: [ + [ + -10, + 10, + 0 + ], + [ + -10, + 10, + 1 + ], + [ + -10, + 10, + 5 + ] + ] + }, + { + id: "camera_rotation_p", + name: "Camera rotation (portrait)", + type: "int", + array: true, + visible: "position", + values: [ + [ + -360, + 360, + 0 + ], + [ + -360, + 360, + 0 + ], + [ + -360, + 360, + 0 + ] + ] + }, + { + id: "camera_fov_l", + name: "Camera FOV (landscape)", + type: "int", + values: [ + 30, + 150, + 60 + ] + }, + { + id: "camera_position_l", + name: "Camera position (landscape)", + type: "float", + array: true, + visible: "position", + values: [ + [ + -10, + 10, + 0 + ], + [ + -10, + 10, + 1 + ], + [ + -10, + 10, + 5 + ] + ] + }, + { + id: "camera_rotation_l", + name: "Camera rotation (landscape)", + type: "int", + array: true, + visible: "position", + values: [ + [ + -360, + 360, + 0 + ], + [ + -360, + 360, + 0 + ], + [ + -360, + 360, + 0 + ] + ] + } + ] + } +] \ No newline at end of file diff --git a/src/configUIParams/installBanner.ts b/src/configUIParams/installBanner.ts new file mode 100644 index 0000000..0c1d004 --- /dev/null +++ b/src/configUIParams/installBanner.ts @@ -0,0 +1,178 @@ +import { ConfigUiParamsCategories } from "@24tools/ads_common"; + +export const installBanner: ConfigUiParamsCategories[] = [ + { + name: "Install Banner Settings", + id: "install_button", + params: [ + { + id: "install_button_text", + name: "Install Button Text", + type: "string", + values: ["INSTALL"], + }, + { + id: "install_button_active", + name: "Install Banner Active", + type: "bool", + values: [true], + }, + { + id: "install_icon_image", + name: "Icon image", + type: "upload_file", + file_type: "picture", + values: [ + "data:image/webp;base64,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", + ], + }, + { + id: "install_button_image", + name: "Button image", + type: "upload_file", + file_type: "picture", + values: [ + "data:image/webp;base64,UklGRiYDAABXRUJQVlA4WAoAAAAQAAAAGwEAWQAAQUxQSK8AAAARZ2AgksykT2Ab0ICIiNqJzj0Abm3bqqqNS0TuBWgBmlOC3jKw3HO3Alyjl+Fwu+KlbPz/iP5PAAAEG1d595WsDuriIikcGVRsZ0niSHOzkTTGAcQkkQZgzoQduDDRhZBUGoZcWLdchI5cFE9cdK9cKPLf///+/wC+cqGcuagfuShuufAOubAKLgw4MzEC5kzYAcGEHsCKhwQA2C4sdDU3EBcORgaoe0rX+6fktAAAAFZQOCBQAgAAEBQAnQEqHAFaAD6BPpxJJSOjISE4CxCgEAlN26/bYsZ6ssczzXPx6YBvNxERAGuGs/lCKCvLVkBOEgwkGEgwkGEgwkGEgwZPpfI4b08Wvc3cT6E8zDoD9cSyp4mNv4bvSPcKnMQEE8zCE9X/cXEaqdODUAunBo2ANLzv5r0iwFTGKwuJdHCfB/AtnLGsfDN34YhUP4HYbYvJF5I9ZF5IvOHrIuSLjyRXIAD+/BV47FjYbqfCVSXkEOemBponzxRpALgvZrkB9P5/9e4uYih5LinbP1ai4HCCgU/txn+e55T2aA7gr7wZxOv+C9g6Eg/sR6AOrv78RKdlJEQjyCntBYixyHn4t6hzOZtaCDIPymwEDctbIENghpLmE36ChPAtQ3Om2yz88jua+6bvRvEB0/ULqHD+GelRcBl2QTRliAa+ZGmWyrr9tOZWtC9rL+VzR+i03lfQwcZHjJLfdkoaQoS8IMOj5TBgJXzfchXFCaNEy66UuxP2CLAVZLQNyxgXFjYkc13hfhgLchmd7gMtXAKvoEHutEUyAAAADUT0OS2hRk3Abkw4oBkGAdwmfPVI6AI0AZASBido6Lab7MQPT5SxLVnZKoawf/yN+ByXsbJEw/THEBDMyseY4+Xx/E7+bDFcT4+33D1ANq87Sqi3c+v0i/HlU7RXMpLVL44Clz2in//SVMmLR41pZEdIWhqyhTIwxaNaKoZIHXPg0WqWvzXrkhp6MdCMzchM2zsk7LOJdUXZJ2zf/5ROnyMYXTAk0Wd87zKX4+nHAlYkyaYAAA==", + ], + }, + { + id: "portret_style", + name: "Portrait style setting", + type: "group", + params: [ + { + id: "install_button_p", + name: "Install button setting", + type: "group", + params: [ + { + id: "install_button_x_p", + name: "Install button portrait X (%)", + type: "int", + values: [0, 100, 100], + }, + { + id: "install_button_y_p", + name: "Install button portrait Y (%)", + type: "int", + values: [0, 100, 100], + }, + { + id: "install_button_sc_p", + name: "Install button portrait scale (%)", + type: "float", + values: [0.5, 2, 1], + }, + { + id: "text_top_offset_y_p", + name: "Text Offset Y portrait", + type: "float", + values: [-5, 5, 0], + }, + { + id: "button_text_size_p", + name: "Button Text Size portrait", + type: "float", + values: [1, 10, 5], + }, + ], + }, + { + id: "install_icon_p", + name: "Icon Banner setting", + type: "group", + params: [ + { + id: "install_b_icon_x_p", + name: "Icon Banner portrait X (%)", + type: "int", + values: [0, 100, 0], + }, + { + id: "install_b_icon_y_p", + name: "Icon Banner portrait Y (%)", + type: "int", + values: [0, 100, 100], + }, + { + id: "install_b_icon_sc_p", + name: "Icon Banner portrait scale (%)", + type: "float", + values: [0.5, 2, 1], + }, + ], + }, + ], + }, + { + id: "install_button_l", + name: "Landscape style setting", + type: "group", + params: [ + { + id: "install_button_l", + name: "Install button setting", + type: "group", + params: [ + { + id: "install_button_x_l", + name: "Install button landscape X (%)", + type: "int", + values: [0, 100, 100], + }, + { + id: "install_button_y_l", + name: "Install button landscape Y (%)", + type: "int", + values: [0, 100, 100], + }, + { + id: "install_button_sc_l", + name: "Install button landscape scale (%)", + type: "float", + values: [0.5, 2, 1], + }, + { + id: "text_top_offset_y_l", + name: "Text Offset Y landscape", + type: "float", + values: [-5, 5, 0], + }, + { + id: "button_text_size_l", + name: "Button Text Size landscape", + type: "float", + values: [1, 10, 4], + }, + ], + }, + { + id: "install_icon_l", + name: "Icon Banner setting", + type: "group", + params: [ + { + id: "install_b_icon_x_l", + name: "Icon Banner landscape X (%)", + type: "int", + values: [0, 100, 0], + }, + { + id: "install_b_icon_y_l", + name: "Icon Banner landscape Y (%)", + type: "int", + values: [0, 100, 100], + }, + { + id: "install_b_icon_sc_l", + name: "Icon Banner landscape scale (%)", + type: "float", + values: [0.5, 2, 1], + }, + ], + }, + ], + }, + ], + }, +]; diff --git a/src/configUIParams/sounds.ts b/src/configUIParams/sounds.ts new file mode 100644 index 0000000..e5559a5 --- /dev/null +++ b/src/configUIParams/sounds.ts @@ -0,0 +1,35 @@ +import { ConfigUiParamsCategories } from "@24tools/ads_common"; + +export const sounds: ConfigUiParamsCategories[] = [ + { + name: "Audio Settings", + id: "sounds", + params: [ + { + id: "global_volume", + name: "Global, %", + type: "int", + values: [0, 100, 80], + }, + { + id: "background_head", + name: "Background", + type: "group", + params: [ + { + id: "background_volume", + name: "Background, %", + type: "int", + values: [0, 100, 50], + }, + { + id: "upload_background_music", + name: "Upload background music", + type: "upload_file", + file_type: "sound", + }, + ], + }, + ], + }, +]; diff --git a/src/controllers/CameraC.ts b/src/controllers/CameraC.ts new file mode 100644 index 0000000..80096da --- /dev/null +++ b/src/controllers/CameraC.ts @@ -0,0 +1,26 @@ +import { CameraC_internal, Helper, Template } from "@24tools/playable_template"; +import { PerspectiveCamera } from "three"; + +export class CameraC extends CameraC_internal { + static setCamera(portraitOrientation: boolean) { + const CATEGORY = Template.getCategory("global"); + if (this.camera !== null) { + let position = portraitOrientation + ? Helper.returnVectorCamera(CATEGORY["camera_position_p"] as number[]) + : Helper.returnVectorCamera(CATEGORY["camera_position_l"] as number[]); + const rotation = portraitOrientation + ? Helper.returnEulerCamera(CATEGORY["camera_rotation_p"] as number[]) + : Helper.returnEulerCamera(CATEGORY["camera_rotation_l"] as number[]); + this.camera.rotation.x = rotation.x; + this.camera.rotation.y = rotation.y; + this.camera.rotation.z = rotation.z; + this.camera.position.copy(position.clone()); + if (this.camera instanceof PerspectiveCamera) { + this.camera.fov = portraitOrientation + ? Number(CATEGORY["camera_fov_p"]) + : Number(CATEGORY["camera_fov_l"]); + this.camera.updateProjectionMatrix(); + } + } + } +} diff --git a/src/controllers/PhysicsC.ts b/src/controllers/PhysicsC.ts new file mode 100644 index 0000000..32d6ccc --- /dev/null +++ b/src/controllers/PhysicsC.ts @@ -0,0 +1,129 @@ +import { + Delegate, + Physics_internal, + UpdateController, +} from "@24tools/playable_template"; +import { Box3, Object3D, Vector3 } from "three"; +import { Body, Box, Quaternion, Sphere, Vec3 } from "cannon-es"; + +export enum PhysicsLayer { + Player = 1, + Wall = 2, + Trigger = 4, + Enemy = 8, +} + +export class PhysicsBody { + private body: Body; + private pair: PhysicsObjPair | null = null; + + constructor( + threeObj: Object3D, + trigger: boolean, + mass: number, + col_group: PhysicsLayer, + col_mask: PhysicsLayer, + player_sphere: number = 0.3 + ) { + let isPlayer = col_group === PhysicsLayer.Player; + + let oldQuaternion = threeObj.quaternion.clone(); + + let nullQuaternion = new Quaternion(); + threeObj.quaternion.copy(nullQuaternion); + + let bbox = new Box3().setFromObject(threeObj); + + let size = new Vector3(); + bbox.getSize(size); + + // if you need custom size + // if (col_group === PhysicsLayer.wall) { + // size.x = size.z = 1; + // size.y = 1; + // } + + threeObj.quaternion.copy(oldQuaternion); + + this.body = new Body({ + isTrigger: trigger, + mass: mass, + //shape: shape, + shape: isPlayer + ? new Sphere(player_sphere) + : new Box(new Vec3(size.x / 2, size.y / 2, size.z / 2)), + collisionFilterGroup: col_group, + collisionFilterMask: col_mask, + }); + + let worldPos = threeObj.getWorldPosition(new Vector3()); + + this.body.position.set(worldPos.x, worldPos.y, worldPos.z); + + this.body.quaternion.setFromEuler( + threeObj.rotation.x, + threeObj.rotation.y, + threeObj.rotation.z, + "XYZ" + ); + + // if you need sync three obj and physics body + // if (isEnemy) { + // let pair = new PhysicsObjPair(threeObj, this.body); + // PhysicsC_Instance.addPhysicsPair(pair); + + // this.pair = pair; + // } + + Physics_internal.physicsWorld && + Physics_internal.physicsWorld.addBody(this.body); + + return this; + } + + disablePhysicsPair() { + if (this.pair) { + this.pair.destroyed = true; + } + } + + getPhysicsBody() { + return this.body; + } + + destroy() { + if (!Physics_internal.physicsWorld) return; + + Physics_internal.physicsWorld.removeBody(this.body); + + (this.body as any) = null; + } +} + +export class PhysicsObjPair { + threeObj: Object3D; + physicsObj: Body; + destroyed: boolean; + delegateId: null | Delegate; + + constructor(threeObj: Object3D, physicsObj: Body) { + this.threeObj = threeObj; + this.physicsObj = physicsObj; + this.destroyed = false; + + this.delegateId = UpdateController.Instance.onUpdate.addDelegate(() => { + this.update(); + }); + } + + update() { + if (this.destroyed) return; + + if (this.threeObj && this.physicsObj) { + // @ts-ignore + this.threeObj.position.copy(this.physicsObj.position); + // @ts-ignore + this.threeObj.quaternion.copy(this.physicsObj.quaternion); + } + } +} diff --git a/src/controllers/TestSceneC.ts b/src/controllers/TestSceneC.ts new file mode 100644 index 0000000..d91db27 --- /dev/null +++ b/src/controllers/TestSceneC.ts @@ -0,0 +1,42 @@ +import { BoxGeometry, Mesh, MeshStandardMaterial, Vector3 } from "three"; +import { ThreeC } from "./ThreeC"; +import { InputC, JoystickC } from "@24tools/playable_template"; + +export class TestSceneC { + static init() { + this.createPrimitive(); + + // example of using InputC events + InputC.onTouchDown.addDelegate((event) => { + console.log("onMouseDown", event); + }); + + // if you have update in your controller + // UpdateController.Instance.onUpdate.addDelegate(() => { + // this.update(); + // }); + } + + private static createPrimitive() { + const geometry = new BoxGeometry(1, 1, 1); + const material = new MeshStandardMaterial({ color: 0xcc0000 }); + const cube = new Mesh(geometry, material); + + const geometryPlane = new BoxGeometry(5, 0.1, 7); + const materialPlane = new MeshStandardMaterial({ color: 0xaaaaaa }); + const plane = new Mesh(geometryPlane, materialPlane); + + let planePosition = plane.position.clone(); + + ThreeC.setShadowsStateForChildren(cube, true, false); + + ThreeC.setShadowsStateForChildren(plane, false, true); + + plane.position.copy( + new Vector3(planePosition.x, planePosition.y - 0.5, planePosition.z - 1.5) + ); + + ThreeC.addToScene(cube); + ThreeC.addToScene(plane); + } +} diff --git a/src/controllers/ThreeC.ts b/src/controllers/ThreeC.ts new file mode 100644 index 0000000..4dfd974 --- /dev/null +++ b/src/controllers/ThreeC.ts @@ -0,0 +1,68 @@ +import { ColorFormat } from "@24tools/ads_common"; +import { ThreeC_internal, Template } from "@24tools/playable_template"; +import { AmbientLight, DirectionalLight } from "three"; +import { Color } from "three/src/math/Color"; + +export class ThreeC extends ThreeC_internal { + static createBaseLights() { + this.defaultDirectionalLight = new DirectionalLight(0xffffff, 3.5); + this.defaultAmbientLight = new AmbientLight(0xffffff, 1); + + this.defaultAmbientLight.color = new Color().setHex( + Number(Template.getValue("global", "light_color")) + ); + this.defaultAmbientLight.intensity = + Template.getValue("global", "light_intensity") + } + + static setupDirectionalLightFromScene(dirLightObj:DirectionalLight) { + if (!dirLightObj) return; + + ThreeC.removeFromScene(this.defaultDirectionalLight); + + let light = dirLightObj; + + let d = 15; + light.shadow.camera.left = -10; + light.shadow.camera.right = d; + light.shadow.camera.top = d; + light.shadow.camera.bottom = -2; + + light.castShadow = true; + light.shadow.normalBias = 0.04; + light.intensity = 1; + + light.shadow.mapSize.width = 1024; + light.shadow.mapSize.height = 1024; + + const ambLight = new AmbientLight(0xffffff, 0.4); // soft white light + this.addToScene(ambLight); + this.addToScene(light); + + this.defaultDirectionalLight = light; + } + + static setupDirectionalLight() { + let dirLight = this.defaultDirectionalLight; + + dirLight.position.set(8, 10, 4); //default; light shining from top + + let d = 10; + dirLight.shadow.camera.left = -d; + dirLight.shadow.camera.right = d; + dirLight.shadow.camera.top = d; + dirLight.shadow.camera.bottom = -d; + dirLight.target.position.set(0, 0, 0); + dirLight.castShadow = true; + + this.addToScene(dirLight); + + this.addToScene(this.defaultAmbientLight); + this.addToScene(dirLight.target); + + dirLight.shadow.mapSize.width = 1024; + dirLight.shadow.mapSize.height = 1024; + dirLight.shadow.camera.near = 0.5; + dirLight.shadow.camera.far = 200; + } +} diff --git a/src/css/loader.css b/src/css/loader.css new file mode 100644 index 0000000..f6c36e3 --- /dev/null +++ b/src/css/loader.css @@ -0,0 +1,108 @@ +@keyframes disableLoader { + from { + opacity: 1; + } + to { + opacity: 0; + display: none; + } +} +.loader { + pointer-events: none; + display: flex; + flex-direction: column; + justify-content: space-between; + position: fixed; + width: 100.5vw; + height: 100.5vh; + z-index: 5000; + display: flex; + align-items: center; + background: linear-gradient(30deg, #0c284e 0%, #4291f3 100%); +} +.loader_block { + padding-top: 18%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + width: 55%; + height: 100%; + padding-bottom: 2vw; +} +.loader_box { + pointer-events: none; + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + margin-top: auto; + margin-bottom: auto; +} +.loader_icon { + pointer-events: none; + width: 100%; + height: auto; + display: block; + border-radius: 5vw; + border: 2vw solid white; + box-shadow: 0px 2vw 50px rgba(0, 0, 0, 0.4); + box-sizing: border-box; +} +.loader_wrapper { + pointer-events: none; + height: 6vw; + width: 100%; + border-radius: 2.7vw; + border: 0.6vw solid #fff; + overflow: hidden; + box-sizing: border-box; +} +.loader_line { + pointer-events: none; + background-color: #ffc530; + height: 100%; + width: 0; + margin-bottom: 20%; + transition: width 200ms; +} +.loader_text { + pointer-events: none; + font-size: 8vw; + color: #fff; + display: block; + margin: 0; + margin-bottom: 2vw; +} +.logo24 { + pointer-events: none; + width: 60%; + margin-bottom: 10px; + fill: white; +} +@media (orientation: landscape) { + .loader_block { + padding-top: 3%; + width: 50vh; + } + .loader_icon { + border-radius: 5vh; + border: 2vh solid white; + box-shadow: 0px 2vh 50px rgba(0, 0, 0, 0.4); + } + .loader_wrapper { + height: 2.8vw; + width: 100%; + border-radius: 2.5vh; + border: 0.6vh solid #fff; + } + .loader_line { + height: 100%; + width: 0; + transition: width 250ms; + } + .loader_text { + font-size: 6vh; + margin-bottom: 2vh; + } +} diff --git a/src/css/main.css b/src/css/main.css new file mode 100644 index 0000000..8a0f7e4 --- /dev/null +++ b/src/css/main.css @@ -0,0 +1,137 @@ +html, +body { + overflow-x: hidden; + overflow-y: hidden; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; +} + +* { + touch-action: none; + /* mintegral problem */ + user-select: none; + -webkit-touch-callout: none; + /* iOS Safari */ + -webkit-user-select: none; + /* Chrome/Safari/Opera */ + -khtml-user-select: none; + /* Konqueror */ + -moz-user-select: none; + /* Firefox */ + -ms-user-select: none; + -webkit-tap-highlight-color: transparent; + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + margin: 0; + background: #ffffff; +} + +html { + font-size: 10vw; + font-family: gameFont, sans-serif; + position: fixed; +} + +canvas { + width: 100%; + height: 100%; +} + +#debug_label { + position: absolute; + top: 5%; + left: 30%; + width: 40%; + text-align: center; + font-size: 5vw; + color: black; +} + +#ui_screen { + position: fixed; + left: 0; + top: 0; + bottom: 0; + right: 0; + z-index: 2; + display: flex; + flex-direction: column; + justify-content: space-between; + padding-top: 0vh; + padding-bottom: 0vh; +} + +#constructor { + position: fixed; + inset: 0; + display: flex; + align-items: center; + justify-content: center; +} + +#videoPlayable { + height: auto; + width: 100vw; +} + +#interactive { + z-index: 10; + position: fixed; + inset: 0; + width: 100%; + height: 100%; + opacity: 0; + + transition: opacity 500ms ease-out; + background-color: whitesmoke; + display: flex; + justify-content: center; + align-items: center; + padding: 20px; +} + +#editor { + pointer-events: none; +} + +#ui, +#editor { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: calc(100vh * 9 / 16); + height: 100vh; +} + +#modal { + z-index: 10000; +} + +.interactive-text { + color: rgb(83, 38, 0); + font-size: 5vh; + font-family: Arial, Helvetica, sans-serif; + text-align: center; +} + +#joystick_zone { + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + z-index: 900; +} + +@media (orientation: landscape) { + #videoPlayable { + height: 100vh; + width: auto; + } +} diff --git a/src/css/ui.css b/src/css/ui.css new file mode 100644 index 0000000..a30a41c --- /dev/null +++ b/src/css/ui.css @@ -0,0 +1,4 @@ +#ui { + /* flex-basis: 60%; */ + flex-grow: 1; +} diff --git a/src/fonts/customFont.ts b/src/fonts/customFont.ts new file mode 100644 index 0000000..da1041a --- /dev/null +++ b/src/fonts/customFont.ts @@ -0,0 +1,3 @@ +import { FontFamily, formFontFamily } from "@24tools/ads_common"; + +export const customFont: undefined | Promise = undefined diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..877f0ef --- /dev/null +++ b/src/index.html @@ -0,0 +1,49 @@ + + + + + + + Playable + + + + + + + +
+
+ +
+

loading

+
+
+
+
+ +
+
+
+

Redirected to store...

+
+ +
+
+
+
+ + + + diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..4eb2600 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,37 @@ +import { formConfigForPlayable, formConfigUI, formConfigUIParams, TemplateType } from "@24tools/ads_common"; +import { resources } from "./resources/resources"; +import { resizeCb } from "./templateConfig/resizeCb"; +import { gameRedirectedCb } from "./templateConfig/gameRedirectedCb"; +import { playableIsVisibleCb } from "./templateConfig/playableIsVisibleCb"; +import { beforeResourcesLoadedCb } from "./templateConfig/beforeResourcesLoadedCb"; +import { afterResourcesLoadedCb } from "./templateConfig/afterResourcesLoadedCb"; +import { customFont } from "./fonts/customFont"; +import { configUIParams } from "./configUIParams/configUIParams"; +import { Template, Template3d } from "@24tools/playable_template"; +import { firstClickCb } from "./templateConfig/firstClickCb"; +Template.set24ADSControls(); +window.setupConfig = async function (config) { + Template.initConfig({ + templateType: TemplateType["3d"], + redirectOptions: {}, + ticker: Template3d.ticker, + debug: { + physics: false, + // set true if you want to enable physics debugger + logger: false // set true if you want to enable logger + } + }).init({ + config: config || formConfigForPlayable(formConfigUI({ + type_default: Template.templateType, + params_categories: formConfigUIParams(...configUIParams), + font_custom_default: await customFont + })), + resources, + afterResourcesLoadedCb, + beforeResourcesLoadedCb, + resizeCb, + playableIsVisibleCb, + gameRedirectedCb, + firstClickCb + }); +}; \ No newline at end of file diff --git a/src/resources/images/CharacterSelectionUI_Logo.webp b/src/resources/images/CharacterSelectionUI_Logo.webp new file mode 100644 index 0000000..2a6687f Binary files /dev/null and b/src/resources/images/CharacterSelectionUI_Logo.webp differ diff --git a/src/resources/images/banner_button.webp b/src/resources/images/banner_button.webp new file mode 100644 index 0000000..a92e3f2 Binary files /dev/null and b/src/resources/images/banner_button.webp differ diff --git a/src/resources/images/icon.webp b/src/resources/images/icon.webp new file mode 100644 index 0000000..aef4bb9 Binary files /dev/null and b/src/resources/images/icon.webp differ diff --git a/src/resources/images/logo24.png b/src/resources/images/logo24.png new file mode 100644 index 0000000..00056ee Binary files /dev/null and b/src/resources/images/logo24.png differ diff --git a/src/resources/meshes/meshes.ts b/src/resources/meshes/meshes.ts new file mode 100644 index 0000000..dafac7a --- /dev/null +++ b/src/resources/meshes/meshes.ts @@ -0,0 +1,14 @@ +// import { ConvertToBase64WhenRelease } from "@24tools/ads_common"; +import { ConvertResourceType, Template3d } from "@24tools/playable_template"; + + +export const meshes : ConvertResourceType = { + type: "mesh", + resources: [ + // { + // name: "scene", + // value: ConvertToBase64WhenRelease("./SceneДombo.glb"), + // }, + ], + loader: Template3d.meshLoader +} \ No newline at end of file diff --git a/src/resources/resources.ts b/src/resources/resources.ts new file mode 100644 index 0000000..280f359 --- /dev/null +++ b/src/resources/resources.ts @@ -0,0 +1,5 @@ +import { ConvertResourcesType } from "@24tools/playable_template"; +import { meshes } from "./meshes/meshes"; +import { sounds } from "./sounds/sounds"; + +export const resources: ConvertResourcesType = [meshes, sounds]; diff --git a/src/resources/sounds/sounds.ts b/src/resources/sounds/sounds.ts new file mode 100644 index 0000000..0e260cc --- /dev/null +++ b/src/resources/sounds/sounds.ts @@ -0,0 +1,13 @@ +// import { ConvertToBase64WhenRelease } from "@24tools/ads_common"; +import { ConvertResourceType } from "@24tools/playable_template"; + + +export const sounds : ConvertResourceType = { + type: "sounds", + resources: [ + // { + // name: "background", + // value: ConvertToBase64WhenRelease(`./background.mp3`), + // }, + ], +} \ No newline at end of file diff --git a/src/templateConfig/afterResourcesLoadedCb.ts b/src/templateConfig/afterResourcesLoadedCb.ts new file mode 100644 index 0000000..eb346c6 --- /dev/null +++ b/src/templateConfig/afterResourcesLoadedCb.ts @@ -0,0 +1,8 @@ +import { TestSceneC } from "../controllers/TestSceneC"; +import { SoundC, Template } from "@24tools/playable_template"; + +export const afterResourcesLoadedCb: (() => void) | undefined = () => { + TestSceneC.init(); + SoundC.init(); + Template.disableLoader(); +}; diff --git a/src/templateConfig/beforeResourcesLoadedCb.ts b/src/templateConfig/beforeResourcesLoadedCb.ts new file mode 100644 index 0000000..5507c3d --- /dev/null +++ b/src/templateConfig/beforeResourcesLoadedCb.ts @@ -0,0 +1,74 @@ +import { + CameraC_internal, + CameraType, + // JoystickC, + Physics_internal, + Template, + Template3d, + ThreeC_internal, + FilterScene, + InstallBanner, +} from "@24tools/playable_template"; +import { CameraC } from "../controllers/CameraC"; +import { ThreeC } from "../controllers/ThreeC"; +import { Color } from "three"; +import { Vec3 } from "cannon-es"; +export const beforeResourcesLoadedCb = () => { + FilterScene.init(); + InstallBanner.init(); + + Template3d.init(); + CameraC_internal.init(CameraType.perspective); + CameraC.setCamera(window.screenSize.portrait); + ThreeC_internal.init(); + ThreeC.createBaseLights(); + ThreeC.setupDirectionalLight(); + + let physicsWorld = Physics_internal.init(new Vec3(0, -9.81, 0)); + + // example of using joystick. Uncomment if you need joystick + + // JoystickC.init({ + // zone: document.getElementById("joystick_zone") as HTMLDivElement, + // fadeTime: 0, + // mode: "dynamic", + // restJoystick: true, + // catchDistance: 1, + // restOpacity: 0, + // follow: false, + // }); + + // JoystickC.onJoysticMove.addDelegate(({event, data}) => { + // console.log('onJoysticMove', event, data); + // }) + + Template.updateVariableConfig.addDelegate(([category, variable, value]) => { + if (category === "global") { + switch (variable) { + case "light_intensity": + ThreeC_internal.defaultAmbientLight.intensity = Number(value); + break; + + case "light_color": + ThreeC_internal.defaultAmbientLight.color = new Color(value as any); + break; + + default: + if ( + [ + "camera_fov_p", + "camera_position_p", + "camera_rotation_p", + "camera_fov_l", + "camera_position_l", + "camera_rotation_l", + ].includes(variable) + ) { + CameraC.setCamera(window.screenSize.portrait); + } + break; + } + return; + } + }); +}; diff --git a/src/templateConfig/firstClickCb.ts b/src/templateConfig/firstClickCb.ts new file mode 100644 index 0000000..6f9d33c --- /dev/null +++ b/src/templateConfig/firstClickCb.ts @@ -0,0 +1,3 @@ +export const firstClickCb: () => void = () => { + console.log("First click"); +}; diff --git a/src/templateConfig/gameRedirectedCb.ts b/src/templateConfig/gameRedirectedCb.ts new file mode 100644 index 0000000..1fc74e8 --- /dev/null +++ b/src/templateConfig/gameRedirectedCb.ts @@ -0,0 +1 @@ +export const gameRedirectedCb : (() => void) | undefined = undefined \ No newline at end of file diff --git a/src/templateConfig/playableIsVisibleCb.ts b/src/templateConfig/playableIsVisibleCb.ts new file mode 100644 index 0000000..707a2ef --- /dev/null +++ b/src/templateConfig/playableIsVisibleCb.ts @@ -0,0 +1 @@ +export const playableIsVisibleCb : (() => void) | undefined = undefined \ No newline at end of file diff --git a/src/templateConfig/resizeCb.ts b/src/templateConfig/resizeCb.ts new file mode 100644 index 0000000..d143387 --- /dev/null +++ b/src/templateConfig/resizeCb.ts @@ -0,0 +1,5 @@ +import { Template3d } from "@24tools/playable_template"; + +export const resizeCb = () => { + Template3d.resize(); +}; diff --git a/src/types/global.d.ts b/src/types/global.d.ts new file mode 100644 index 0000000..4194feb --- /dev/null +++ b/src/types/global.d.ts @@ -0,0 +1,37 @@ +import type { ConvertResourcesType, RedirectOptions, screenSize } from '@24tools/playable_template'; +import { ConfigCreative } from '@24tools/ads_common'; + +declare global { + interface Window extends Window { + CustomizationRedirectCallback: any; + registerRedirectCallback: (el: any) => void; + updateVariableConfig: ( + category: string, + variable: string, + value: any + ) => void; + setupConfig: (config?: ConfigCreative) => void; + soundConfig: ( + category: "setMute" | "getMute" | "setVolume" | "getVolume", + value?: boolean | number + ) => boolean | number | undefined; + isStarted?: boolean; + CONFIG: ConfigCreative; + gameStart: () => void; + gameClose: () => void; + gameReady: () => void; + gameEnd: () => void; + screenSize: screenSize; + showLoader: (state: boolean) => void; + setRedirectOptions: (option: RedirectOptions | null) => void; + openGameStorePage: (cb: () => void) => void; + start: () => void + mraid: any + convertResources: ConvertResourcesType + startTime: number + updateVideoState: (cbUpdate: (state: "play" | "pause") => void) => void; + updateCurrentStep: (cbUpdate: (videoStep: VideoStep) => void) => void; + } +} + +export {}; \ No newline at end of file diff --git a/templateLibs/export.cjs b/templateLibs/export.cjs new file mode 100644 index 0000000..ea1e26e --- /dev/null +++ b/templateLibs/export.cjs @@ -0,0 +1,6 @@ +#!/usr/bin/env node + +const { localExporter } = require("@24tools/ads_common"); +const { resolve } = require("path"); + +localExporter(resolve(__dirname, "../")).parse(process.argv); diff --git a/templateLibs/update.cjs b/templateLibs/update.cjs new file mode 100644 index 0000000..c5ff4e1 --- /dev/null +++ b/templateLibs/update.cjs @@ -0,0 +1,4 @@ +const { templateUpdater } = require("@24tools/ads_common"); +const { resolve } = require("path"); + +templateUpdater(resolve(__dirname, "../")); diff --git a/templateLibs/zip.cjs b/templateLibs/zip.cjs new file mode 100644 index 0000000..471caf5 --- /dev/null +++ b/templateLibs/zip.cjs @@ -0,0 +1,4 @@ +const { createBuildFor24ADS } = require("@24tools/ads_common"); +const { resolve } = require("path"); + +createBuildFor24ADS(resolve(__dirname, "../")); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..bb391ca --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "noEmit": false, + "removeComments": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitAny": false, + "allowJs": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "templateLibs", "build", "zip"] +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..2a36d68 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,15 @@ +import { defineConfig } from "vite"; +import { defineConfigTemplate} from "@24tools/ads_common"; +import { dependencies } from "./package.json"; + +const rootDev = "src"; +const rootBuild = "src"; + +export default defineConfig((config) => { + return defineConfigTemplate({ + rootDev, + rootBuild, + config, + dependenciesArr: Object.keys(dependencies), + }); +});