cuju-render 0.1.0__py3-none-any.whl
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.
- cuju/render/__init__.py +759 -0
- cuju/render/__main__.py +1065 -0
- cuju/render/_export/__init__.py +3 -0
- cuju/render/_export/feed.py +542 -0
- cuju/render/_export/sizes.py +157 -0
- cuju/render/_export/video.py +1618 -0
- cuju/render/_export/video_jobs.py +408 -0
- cuju/render/_format/__init__.py +3 -0
- cuju/render/_format/annotations.py +235 -0
- cuju/render/_format/codec.py +307 -0
- cuju/render/_format/keep.py +121 -0
- cuju/render/_format/recording.py +860 -0
- cuju/render/_format/writer.py +54 -0
- cuju/render/_guide/__init__.py +3 -0
- cuju/render/_guide/doctor.py +523 -0
- cuju/render/_guide/help.py +62 -0
- cuju/render/_guide/tutorial.py +254 -0
- cuju/render/_http/__init__.py +3 -0
- cuju/render/_http/commands.py +57 -0
- cuju/render/_http/headers.py +103 -0
- cuju/render/_http/launch.py +500 -0
- cuju/render/_http/launchers.py +408 -0
- cuju/render/_http/pwa.py +128 -0
- cuju/render/_http/server.py +2105 -0
- cuju/render/_http/window.py +360 -0
- cuju/render/_moments/__init__.py +3 -0
- cuju/render/_moments/captions.py +284 -0
- cuju/render/_moments/events.py +1123 -0
- cuju/render/_moments/search.py +694 -0
- cuju/render/_packages/__init__.py +3 -0
- cuju/render/_packages/glsl.py +746 -0
- cuju/render/_packages/loudness.py +334 -0
- cuju/render/_packages/pack.py +1959 -0
- cuju/render/_packages/presentation.py +1376 -0
- cuju/render/_packages/vocabulary.py +609 -0
- cuju/render/_playing/__init__.py +3 -0
- cuju/render/_playing/achievements.py +463 -0
- cuju/render/_playing/bench.py +609 -0
- cuju/render/_playing/challenges.py +1813 -0
- cuju/render/_playing/demo.py +323 -0
- cuju/render/_playing/draw.py +211 -0
- cuju/render/_playing/errors.py +20 -0
- cuju/render/_playing/game.py +645 -0
- cuju/render/_playing/limits.py +339 -0
- cuju/render/_playing/play.py +926 -0
- cuju/render/_playing/policy_worker.py +250 -0
- cuju/render/_playing/strict.py +810 -0
- cuju/render/_registry/__init__.py +3 -0
- cuju/render/_registry/clips.py +394 -0
- cuju/render/_registry/joints.py +108 -0
- cuju/render/_registry/teams.py +2058 -0
- cuju/render/_store/__init__.py +3 -0
- cuju/render/_store/home.py +70 -0
- cuju/render/_store/library.py +604 -0
- cuju/render/_store/samples.py +163 -0
- cuju/render/_text/__init__.py +3 -0
- cuju/render/_text/languages.py +637 -0
- cuju/render/_text/messages.py +1396 -0
- cuju/render/_tournaments/__init__.py +3 -0
- cuju/render/_tournaments/results.py +547 -0
- cuju/render/_tournaments/tournament.py +2742 -0
- cuju/render/_tournaments/tournament_cli.py +587 -0
- cuju/render/_tournaments/tournament_runner.py +1975 -0
- cuju/render/_version.py +6 -0
- cuju/render/_watch/__init__.py +3 -0
- cuju/render/_watch/grid.py +265 -0
- cuju/render/_watch/live.py +664 -0
- cuju/render/_watch/notebook.py +79 -0
- cuju/render/_watch/show.py +171 -0
- cuju/render/samples/sample-11v11.cjr +0 -0
- cuju/render/samples/sample-5v5.cjr +0 -0
- cuju/render/samples/teams/starter/main.py +33 -0
- cuju/render/scenarios/benchmark_full_game_11_vs_11_easy.py +46 -0
- cuju/render/scenarios/benchmark_full_game_11_vs_11_hard.py +46 -0
- cuju/render/scenarios/benchmark_full_game_11_vs_11_medium.py +46 -0
- cuju/render/scenarios/benchmark_full_game_5_vs_5_easy.py +34 -0
- cuju/render/scenarios/benchmark_full_game_5_vs_5_hard.py +34 -0
- cuju/render/scenarios/benchmark_full_game_5_vs_5_medium.py +34 -0
- cuju/render/web/assets/adboard_polygon.webp +0 -0
- cuju/render/web/assets/adboard_your_ad_here.webp +0 -0
- cuju/render/web/assets/animations/kaykit-rig-medium-combatmelee.glb +0 -0
- cuju/render/web/assets/animations/kaykit-rig-medium-general.glb +0 -0
- cuju/render/web/assets/animations/kaykit-rig-medium-movementadvanced.glb +0 -0
- cuju/render/web/assets/animations/kaykit-rig-medium-movementbasic.glb +0 -0
- cuju/render/web/assets/animations/kaykit-rig-medium-simulation.glb +0 -0
- cuju/render/web/assets/animations/kaykit-rig-medium-special.glb +0 -0
- cuju/render/web/assets/ball.glb +0 -0
- cuju/render/web/assets/challenges/3_vs_1_with_keeper.mp4 +0 -0
- cuju/render/web/assets/challenges/3_vs_1_with_keeper.webp +0 -0
- cuju/render/web/assets/challenges/corner.mp4 +0 -0
- cuju/render/web/assets/challenges/corner.webp +0 -0
- cuju/render/web/assets/challenges/counterattack_easy.mp4 +0 -0
- cuju/render/web/assets/challenges/counterattack_easy.webp +0 -0
- cuju/render/web/assets/challenges/counterattack_hard.mp4 +0 -0
- cuju/render/web/assets/challenges/counterattack_hard.webp +0 -0
- cuju/render/web/assets/challenges/empty_goal.mp4 +0 -0
- cuju/render/web/assets/challenges/empty_goal.webp +0 -0
- cuju/render/web/assets/challenges/empty_goal_close.mp4 +0 -0
- cuju/render/web/assets/challenges/empty_goal_close.webp +0 -0
- cuju/render/web/assets/challenges/manifest.json +375 -0
- cuju/render/web/assets/challenges/one_on_one.mp4 +0 -0
- cuju/render/web/assets/challenges/one_on_one.webp +0 -0
- cuju/render/web/assets/challenges/one_on_one_hard.mp4 +0 -0
- cuju/render/web/assets/challenges/one_on_one_hard.webp +0 -0
- cuju/render/web/assets/challenges/pass_and_shoot_with_keeper.mp4 +0 -0
- cuju/render/web/assets/challenges/pass_and_shoot_with_keeper.webp +0 -0
- cuju/render/web/assets/challenges/run_pass_and_shoot_with_keeper.mp4 +0 -0
- cuju/render/web/assets/challenges/run_pass_and_shoot_with_keeper.webp +0 -0
- cuju/render/web/assets/challenges/run_to_score.mp4 +0 -0
- cuju/render/web/assets/challenges/run_to_score.webp +0 -0
- cuju/render/web/assets/challenges/run_to_score_with_keeper.mp4 +0 -0
- cuju/render/web/assets/challenges/run_to_score_with_keeper.webp +0 -0
- cuju/render/web/assets/challenges/single_goal_versus_lazy.mp4 +0 -0
- cuju/render/web/assets/challenges/single_goal_versus_lazy.webp +0 -0
- cuju/render/web/assets/crowd.webp +0 -0
- cuju/render/web/assets/crowd_normal.webp +0 -0
- cuju/render/web/assets/cuju-logo-384.png +0 -0
- cuju/render/web/assets/cuju-logo.png +0 -0
- cuju/render/web/assets/cuju-logo.svg +46 -0
- cuju/render/web/assets/cuju-mark-light.svg +33 -0
- cuju/render/web/assets/cuju-mark.svg +33 -0
- cuju/render/web/assets/goal.glb +0 -0
- cuju/render/web/assets/grass.webp +0 -0
- cuju/render/web/assets/hair_black.png +0 -0
- cuju/render/web/assets/hair_blonde.png +0 -0
- cuju/render/web/assets/hair_brown.png +0 -0
- cuju/render/web/assets/hair_darkblonde.png +0 -0
- cuju/render/web/assets/hair_long01.glb +0 -0
- cuju/render/web/assets/hair_long02.glb +0 -0
- cuju/render/web/assets/hair_medium01.glb +0 -0
- cuju/render/web/assets/hair_red.png +0 -0
- cuju/render/web/assets/hair_short01.glb +0 -0
- cuju/render/web/assets/hair_short02.glb +0 -0
- cuju/render/web/assets/icons/cuju-192.png +0 -0
- cuju/render/web/assets/icons/cuju-512.png +0 -0
- cuju/render/web/assets/icons/cuju-maskable-512.png +0 -0
- cuju/render/web/assets/kit_goalkeeper.webp +0 -0
- cuju/render/web/assets/kit_mask.png +0 -0
- cuju/render/web/assets/kit_normal.webp +0 -0
- cuju/render/web/assets/manifest.json +601 -0
- cuju/render/web/assets/models/kaykit-barbarian.glb +0 -0
- cuju/render/web/assets/models/kaykit-barbarian.json +23 -0
- cuju/render/web/assets/models/kaykit-knight.glb +0 -0
- cuju/render/web/assets/models/kaykit-knight.json +23 -0
- cuju/render/web/assets/models/kaykit-mage.glb +0 -0
- cuju/render/web/assets/models/kaykit-mage.json +23 -0
- cuju/render/web/assets/models/kaykit-mannequin-medium.glb +0 -0
- cuju/render/web/assets/models/kaykit-mannequin-medium.json +23 -0
- cuju/render/web/assets/models/kaykit-ranger.glb +0 -0
- cuju/render/web/assets/models/kaykit-ranger.json +23 -0
- cuju/render/web/assets/models/kaykit-rogue-hooded.glb +0 -0
- cuju/render/web/assets/models/kaykit-rogue-hooded.json +23 -0
- cuju/render/web/assets/models/kaykit-rogue.glb +0 -0
- cuju/render/web/assets/models/kaykit-rogue.json +23 -0
- cuju/render/web/assets/models/kaykit-skeleton-mage.glb +0 -0
- cuju/render/web/assets/models/kaykit-skeleton-mage.json +23 -0
- cuju/render/web/assets/models/kaykit-skeleton-minion.glb +0 -0
- cuju/render/web/assets/models/kaykit-skeleton-minion.json +23 -0
- cuju/render/web/assets/models/kaykit-skeleton-rogue.glb +0 -0
- cuju/render/web/assets/models/kaykit-skeleton-rogue.json +23 -0
- cuju/render/web/assets/models/kaykit-skeleton-warrior.glb +0 -0
- cuju/render/web/assets/models/kaykit-skeleton-warrior.json +23 -0
- cuju/render/web/assets/pitch.webp +0 -0
- cuju/render/web/assets/pitch_normal.webp +0 -0
- cuju/render/web/assets/player.glb +0 -0
- cuju/render/web/assets/shoe.webp +0 -0
- cuju/render/web/assets/shoe_sole.png +0 -0
- cuju/render/web/assets/skin_01.png +0 -0
- cuju/render/web/assets/skin_02.png +0 -0
- cuju/render/web/assets/skin_03.png +0 -0
- cuju/render/web/assets/skin_04.png +0 -0
- cuju/render/web/assets/sounds/applause.ogg +0 -0
- cuju/render/web/assets/sounds/beach-wave-1.ogg +0 -0
- cuju/render/web/assets/sounds/beach-wave-2.ogg +0 -0
- cuju/render/web/assets/sounds/beach-wave-3.ogg +0 -0
- cuju/render/web/assets/sounds/beach-wave-4.ogg +0 -0
- cuju/render/web/assets/sounds/city-horn.ogg +0 -0
- cuju/render/web/assets/sounds/city-loop.ogg +0 -0
- cuju/render/web/assets/sounds/city-siren.ogg +0 -0
- cuju/render/web/assets/sounds/crowd-cheer.ogg +0 -0
- cuju/render/web/assets/sounds/crowd-loop.ogg +0 -0
- cuju/render/web/assets/sounds/crowd-ooh.ogg +0 -0
- cuju/render/web/assets/sounds/gulls.ogg +0 -0
- cuju/render/web/assets/sounds/neon-sting.ogg +0 -0
- cuju/render/web/assets/sounds/rain-loop.ogg +0 -0
- cuju/render/web/assets/sounds/sounds.json +46 -0
- cuju/render/web/assets/sounds/space-beep.ogg +0 -0
- cuju/render/web/assets/sounds/space-hum.ogg +0 -0
- cuju/render/web/assets/sounds/space-radio.ogg +0 -0
- cuju/render/web/assets/sounds/whistle-long.ogg +0 -0
- cuju/render/web/assets/sounds/whistle-short.ogg +0 -0
- cuju/render/web/assets/sounds/wind-loop.ogg +0 -0
- cuju/render/web/easy.css +357 -0
- cuju/render/web/export.html +23 -0
- cuju/render/web/feed.css +262 -0
- cuju/render/web/feed.html +28 -0
- cuju/render/web/flat.css +120 -0
- cuju/render/web/home.css +837 -0
- cuju/render/web/index.html +373 -0
- cuju/render/web/js/boot.js +50 -0
- cuju/render/web/js/broadcast/audio.js +2141 -0
- cuju/render/web/js/broadcast/celebrate.js +1238 -0
- cuju/render/web/js/broadcast/decisions.js +609 -0
- cuju/render/web/js/broadcast/hud.js +352 -0
- cuju/render/web/js/broadcast/show.js +3614 -0
- cuju/render/web/js/broadcast/transition.js +2231 -0
- cuju/render/web/js/broadcast/voices.js +153 -0
- cuju/render/web/js/capture.js +101 -0
- cuju/render/web/js/core/accessibility.js +90 -0
- cuju/render/web/js/core/api.js +429 -0
- cuju/render/web/js/core/comfort.js +135 -0
- cuju/render/web/js/core/i18n.js +705 -0
- cuju/render/web/js/core/icons.js +167 -0
- cuju/render/web/js/core/input-settings.js +156 -0
- cuju/render/web/js/core/keys.js +277 -0
- cuju/render/web/js/core/language-ui.js +125 -0
- cuju/render/web/js/core/menu.js +853 -0
- cuju/render/web/js/core/names.js +113 -0
- cuju/render/web/js/core/page-structure.js +110 -0
- cuju/render/web/js/core/scenarios.js +109 -0
- cuju/render/web/js/core/spoilers.js +236 -0
- cuju/render/web/js/core/typeahead.js +38 -0
- cuju/render/web/js/export/dom-picture.js +330 -0
- cuju/render/web/js/export/export-host.js +97 -0
- cuju/render/web/js/export/feed-dialog.js +191 -0
- cuju/render/web/js/export/feed-params.js +266 -0
- cuju/render/web/js/export/feed.js +363 -0
- cuju/render/web/js/export/mp4-mux.js +295 -0
- cuju/render/web/js/export/photo-core.js +313 -0
- cuju/render/web/js/export/photo.js +1314 -0
- cuju/render/web/js/export/safe-frame.js +59 -0
- cuju/render/web/js/export/size-fields.js +103 -0
- cuju/render/web/js/export/sizes.js +178 -0
- cuju/render/web/js/export/video-boot.js +55 -0
- cuju/render/web/js/export/video-browser.js +325 -0
- cuju/render/web/js/export/video-export.js +417 -0
- cuju/render/web/js/export/video-plan.js +207 -0
- cuju/render/web/js/export/video-range.js +185 -0
- cuju/render/web/js/export/webm-mux.js +198 -0
- cuju/render/web/js/feed-boot.js +151 -0
- cuju/render/web/js/feed-frame.js +101 -0
- cuju/render/web/js/help/doctor.js +488 -0
- cuju/render/web/js/help/firstrun.js +379 -0
- cuju/render/web/js/help/help-center.js +438 -0
- cuju/render/web/js/help/install-offer.js +164 -0
- cuju/render/web/js/help/install-state.js +104 -0
- cuju/render/web/js/help/lessons-core.js +207 -0
- cuju/render/web/js/help/lessons.js +463 -0
- cuju/render/web/js/help/palette.js +584 -0
- cuju/render/web/js/help/pwa.js +257 -0
- cuju/render/web/js/help/tour-core.js +241 -0
- cuju/render/web/js/help/tour.js +461 -0
- cuju/render/web/js/main.js +2513 -0
- cuju/render/web/js/pages/draw.js +188 -0
- cuju/render/web/js/pages/fieldpage.js +530 -0
- cuju/render/web/js/pages/home.js +521 -0
- cuju/render/web/js/pages/matches.js +779 -0
- cuju/render/web/js/pages/moments-ui.js +359 -0
- cuju/render/web/js/pages/queue-filters.js +63 -0
- cuju/render/web/js/pages/recording-groups.js +80 -0
- cuju/render/web/js/pages/recordings.js +1069 -0
- cuju/render/web/js/play/bench.js +347 -0
- cuju/render/web/js/play/challenges.js +1302 -0
- cuju/render/web/js/play/medals.js +127 -0
- cuju/render/web/js/play/play.js +1953 -0
- cuju/render/web/js/play/teasers.js +196 -0
- cuju/render/web/js/play/touch.js +350 -0
- cuju/render/web/js/play/tournament-layout.js +487 -0
- cuju/render/web/js/play/tournament-results.js +441 -0
- cuju/render/web/js/play/tournament-strict.js +560 -0
- cuju/render/web/js/play/tournament.js +2585 -0
- cuju/render/web/js/players/animate.js +972 -0
- cuju/render/web/js/players/clips.js +224 -0
- cuju/render/web/js/players/kaykit.js +162 -0
- cuju/render/web/js/players/kits.js +676 -0
- cuju/render/web/js/players/number-patch.js +82 -0
- cuju/render/web/js/players/players.js +2694 -0
- cuju/render/web/js/players/recolor.js +893 -0
- cuju/render/web/js/players/retarget.js +325 -0
- cuju/render/web/js/players/rig-numbers.js +174 -0
- cuju/render/web/js/presentation/animator.js +231 -0
- cuju/render/web/js/presentation/assign.js +85 -0
- cuju/render/web/js/presentation/behaviors.js +440 -0
- cuju/render/web/js/presentation/budget.js +209 -0
- cuju/render/web/js/presentation/catalog.js +1674 -0
- cuju/render/web/js/presentation/clocks.js +72 -0
- cuju/render/web/js/presentation/commands.js +301 -0
- cuju/render/web/js/presentation/contract.js +240 -0
- cuju/render/web/js/presentation/effects.js +904 -0
- cuju/render/web/js/presentation/flash.js +605 -0
- cuju/render/web/js/presentation/freeze-worklet.js +22 -0
- cuju/render/web/js/presentation/glsl.js +464 -0
- cuju/render/web/js/presentation/host.js +323 -0
- cuju/render/web/js/presentation/index.js +2066 -0
- cuju/render/web/js/presentation/loudness-worklet.js +235 -0
- cuju/render/web/js/presentation/loudness.js +740 -0
- cuju/render/web/js/presentation/moments.js +536 -0
- cuju/render/web/js/presentation/post.js +327 -0
- cuju/render/web/js/presentation/preview.js +180 -0
- cuju/render/web/js/presentation/protocol.js +174 -0
- cuju/render/web/js/presentation/reach.js +158 -0
- cuju/render/web/js/presentation/rigging.js +130 -0
- cuju/render/web/js/presentation/sandbox.js +157 -0
- cuju/render/web/js/presentation/shaders.js +235 -0
- cuju/render/web/js/presentation/stage.js +402 -0
- cuju/render/web/js/presentation/teamaudio.js +722 -0
- cuju/render/web/js/presentation/tracks.js +197 -0
- cuju/render/web/js/presentation/values.js +81 -0
- cuju/render/web/js/recording/annotation-data.js +203 -0
- cuju/render/web/js/recording/captions.js +491 -0
- cuju/render/web/js/recording/codec.js +185 -0
- cuju/render/web/js/recording/decode-worker.js +70 -0
- cuju/render/web/js/recording/decode.js +94 -0
- cuju/render/web/js/recording/episodes.js +46 -0
- cuju/render/web/js/recording/format.js +461 -0
- cuju/render/web/js/recording/live.js +348 -0
- cuju/render/web/js/recording/moments-query.js +59 -0
- cuju/render/web/js/recording/moments.js +149 -0
- cuju/render/web/js/recording/pose.js +86 -0
- cuju/render/web/js/recording/timeline.js +275 -0
- cuju/render/web/js/teams/art.js +50 -0
- cuju/render/web/js/teams/clip-editor.js +293 -0
- cuju/render/web/js/teams/editor.js +1979 -0
- cuju/render/web/js/teams/library.js +344 -0
- cuju/render/web/js/teams/painter.js +633 -0
- cuju/render/web/js/teams/surprise-ui.js +195 -0
- cuju/render/web/js/teams/surprise.js +497 -0
- cuju/render/web/js/teams/team-check.js +127 -0
- cuju/render/web/js/watch/annotations.js +270 -0
- cuju/render/web/js/watch/flat.js +366 -0
- cuju/render/web/js/watch/grid.js +436 -0
- cuju/render/web/js/watch/pitch2d.js +289 -0
- cuju/render/web/js/watch/player-tools.js +192 -0
- cuju/render/web/js/watch/presets.js +201 -0
- cuju/render/web/js/world/arenas.js +997 -0
- cuju/render/web/js/world/ball.js +204 -0
- cuju/render/web/js/world/cameras.js +982 -0
- cuju/render/web/js/world/crowd.js +376 -0
- cuju/render/web/js/world/field.js +227 -0
- cuju/render/web/js/world/framing.js +145 -0
- cuju/render/web/js/world/occlusion.js +48 -0
- cuju/render/web/js/world/pitch.js +703 -0
- cuju/render/web/js/world/scene.js +395 -0
- cuju/render/web/js/world/sky.js +325 -0
- cuju/render/web/js/world/stadium.js +1262 -0
- cuju/render/web/js/world/vendor-sky.js +367 -0
- cuju/render/web/js/world/weather.js +264 -0
- cuju/render/web/languages/en.json +4750 -0
- cuju/render/web/lessons.json +137 -0
- cuju/render/web/manifest.webmanifest +23 -0
- cuju/render/web/style.css +8399 -0
- cuju/render/web/sw.js +235 -0
- cuju/render/web/vendor/fabric/LICENSE +16 -0
- cuju/render/web/vendor/fabric/fabric.min.mjs +1 -0
- cuju/render/web/vendor/lucide/LICENSE +43 -0
- cuju/render/web/vendor/lucide/icons.js +141 -0
- cuju/render/web/vendor/three/LICENSE +21 -0
- cuju/render/web/vendor/three/build/three.core.js +60586 -0
- cuju/render/web/vendor/three/build/three.module.js +19719 -0
- cuju/render/web/vendor/three/examples/jsm/loaders/GLTFLoader.js +4925 -0
- cuju/render/web/vendor/three/examples/jsm/postprocessing/EffectComposer.js +365 -0
- cuju/render/web/vendor/three/examples/jsm/postprocessing/MaskPass.js +195 -0
- cuju/render/web/vendor/three/examples/jsm/postprocessing/OutputPass.js +148 -0
- cuju/render/web/vendor/three/examples/jsm/postprocessing/Pass.js +191 -0
- cuju/render/web/vendor/three/examples/jsm/postprocessing/RenderPass.js +193 -0
- cuju/render/web/vendor/three/examples/jsm/postprocessing/ShaderPass.js +135 -0
- cuju/render/web/vendor/three/examples/jsm/postprocessing/UnrealBloomPass.js +541 -0
- cuju/render/web/vendor/three/examples/jsm/shaders/CopyShader.js +52 -0
- cuju/render/web/vendor/three/examples/jsm/shaders/LuminosityHighPassShader.js +68 -0
- cuju/render/web/vendor/three/examples/jsm/shaders/OutputShader.js +103 -0
- cuju/render/web/vendor/three/examples/jsm/utils/BufferGeometryUtils.js +1501 -0
- cuju/render/web/vendor/three/examples/jsm/utils/SkeletonUtils.js +496 -0
- cuju_render-0.1.0.dist-info/METADATA +116 -0
- cuju_render-0.1.0.dist-info/RECORD +382 -0
- cuju_render-0.1.0.dist-info/WHEEL +4 -0
- cuju_render-0.1.0.dist-info/licenses/LICENSE +202 -0
- cuju_render-0.1.0.dist-info/licenses/LICENSES/CC-BY-4.0.txt +396 -0
- cuju_render-0.1.0.dist-info/licenses/LICENSES/CC0-1.0.txt +127 -0
- cuju_render-0.1.0.dist-info/licenses/LICENSES/ISC.txt +16 -0
- cuju_render-0.1.0.dist-info/licenses/LICENSES/MIT.txt +24 -0
- cuju_render-0.1.0.dist-info/licenses/LICENSES/Unlicense.txt +13 -0
- cuju_render-0.1.0.dist-info/licenses/NOTICE +35 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// Copyright 2026 The cuju Authors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// The choices of the Matches page for a match drawn at random, which side and scenario are drawn,
|
|
5
|
+
// the pool of teams a random side draws from, the scenarios that fit, and the requests of Play
|
|
6
|
+
// match, Retry and Repeat. The module touches no page, so the Node tests run it alone. The server
|
|
7
|
+
// draws the teams and the scenario from the seed of the request, src/cuju/render/_playing/draw.py.
|
|
8
|
+
|
|
9
|
+
// The word that stands for a team or a scenario drawn at random, as the server reads it.
|
|
10
|
+
export const RANDOM = 'random';
|
|
11
|
+
|
|
12
|
+
// The players a side of each format holds, and the roles of GRF by number, as
|
|
13
|
+
// src/cuju/render/_registry/teams.py names them.
|
|
14
|
+
const FORMAT_SIZES = { '5v5': 5, '11v11': 11 };
|
|
15
|
+
const ROLES = ['GK', 'CB', 'LB', 'RB', 'DM', 'CM', 'LM', 'RM', 'AM', 'CF'];
|
|
16
|
+
|
|
17
|
+
// The players a side of a full match holds, 5 or 11, or null for any other scenario.
|
|
18
|
+
function scenarioSize(scenario) {
|
|
19
|
+
const name = scenario.replace(/^benchmark_full_game_/, '');
|
|
20
|
+
return name.startsWith('5_vs_5') ? 5 : name.startsWith('11_vs_11') ? 11 : null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Why a control setting cannot play a side, as a message and its values, or null when it can,
|
|
24
|
+
// the rule of selected_players in src/cuju/render/_registry/teams.py. The formation lists each
|
|
25
|
+
// player of the side by its role, 0 for the goalkeeper, and whether a team can control it.
|
|
26
|
+
export function controlFault(control, formation) {
|
|
27
|
+
const c = { players: 1, assignment: 'dynamic', selection: [], goalkeeper: 'scenario', ...(control || {}) };
|
|
28
|
+
const available = formation.flatMap((p, i) => (p.controllable ? [i] : []));
|
|
29
|
+
if (c.players > available.length) {
|
|
30
|
+
return { id: 'server.teams.control.too_few', values: { count: available.length } };
|
|
31
|
+
}
|
|
32
|
+
const keeper = formation.flatMap((p, i) => (p.role === 0 ? [i] : []));
|
|
33
|
+
const freeKeeper = keeper.some((i) => available.includes(i));
|
|
34
|
+
if (c.assignment === 'dynamic') {
|
|
35
|
+
return c.goalkeeper === 'agent' && !freeKeeper ? { id: 'server.teams.control.goalkeeper_uncontrollable', values: {} } : null;
|
|
36
|
+
}
|
|
37
|
+
const selected = [];
|
|
38
|
+
for (const item of c.selection) {
|
|
39
|
+
const candidates = Number.isInteger(item) ? [item] : available.filter((i) => formation[i].role === ROLES.indexOf(item));
|
|
40
|
+
const found = candidates.find((i) => available.includes(i) && !selected.includes(i));
|
|
41
|
+
if (found === undefined) {
|
|
42
|
+
return { id: 'server.teams.control.select_player', values: { player: String(item) } };
|
|
43
|
+
}
|
|
44
|
+
selected.push(found);
|
|
45
|
+
}
|
|
46
|
+
const ownsKeeper = selected.some((i) => keeper.includes(i));
|
|
47
|
+
const fault = c.goalkeeper === 'builtin' && !freeKeeper ? 'goalkeeper_builtin'
|
|
48
|
+
: c.goalkeeper === 'agent' && !ownsKeeper ? 'goalkeeper_selected'
|
|
49
|
+
: c.goalkeeper !== 'agent' && ownsKeeper ? 'goalkeeper_outside'
|
|
50
|
+
: c.goalkeeper === 'scenario' && freeKeeper ? 'goalkeeper_scenario' : null;
|
|
51
|
+
return fault ? { id: `server.teams.control.${fault}`, values: {} } : null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Why a team cannot play a side of a scenario, or null when it can, as the server checks it
|
|
55
|
+
// before it queues a match. A team of the other format cannot play a full match of the wrong
|
|
56
|
+
// size, the message matches.draw.unfit.format, and with the players of the scenario's sides,
|
|
57
|
+
// which the server lists at /api/scenarios/sides, the team's control must fit the side. The
|
|
58
|
+
// built-in AI plays any side, and a scenario whose players the page lacks checks the format alone.
|
|
59
|
+
export function unfit(team, scenario, side = 0, sides = null) {
|
|
60
|
+
if (!team || team.kind === 'builtin' || !team.format || !scenario) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const size = scenarioSize(scenario);
|
|
64
|
+
if (size !== null && FORMAT_SIZES[team.format] && size !== FORMAT_SIZES[team.format]) {
|
|
65
|
+
return { id: 'matches.draw.unfit.format', values: { format: team.format } };
|
|
66
|
+
}
|
|
67
|
+
const formation = sides && Array.isArray(sides[scenario]) ? sides[scenario][side] : null;
|
|
68
|
+
return Array.isArray(formation) ? controlFault(team.control, formation) : null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Whether a team can play a side of a scenario.
|
|
72
|
+
export function fits(team, scenario, side = 0, sides = null) {
|
|
73
|
+
return unfit(team, scenario, side, sides) === null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The teams of the pool, every team of the registry but those the person unticked.
|
|
77
|
+
export function poolTeams(teams, unticked) {
|
|
78
|
+
return teams.filter((x) => !unticked.has(x.id));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// The pool as a request names it, null for every team, so a team added later joins the draw.
|
|
82
|
+
export function poolOf(teams, unticked) {
|
|
83
|
+
const kept = poolTeams(teams, unticked).map((x) => x.id);
|
|
84
|
+
return kept.length === teams.length ? null : kept;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// The teams that a side, 0 on the left, can draw for a scenario, or the side's own team in a list
|
|
88
|
+
// of one. `sides` holds the players of the scenarios' sides, as `unfit` reads them.
|
|
89
|
+
export function sideTeams(teams, unticked, id, scenario, side = 0, sides = null) {
|
|
90
|
+
if (id === RANDOM) {
|
|
91
|
+
return poolTeams(teams, unticked).filter((x) => fits(x, scenario, side, sides));
|
|
92
|
+
}
|
|
93
|
+
const own = teams.find((x) => x.id === id);
|
|
94
|
+
return own && fits(own, scenario, side, sides) ? [own] : [];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// The scenarios that the two sides can play, those where each side has a team that fits.
|
|
98
|
+
export function fittingScenarios(scenarios, teams, unticked, left, right, sides = null) {
|
|
99
|
+
return scenarios.filter((sc) => sideTeams(teams, unticked, left, sc, 0, sides).length
|
|
100
|
+
&& sideTeams(teams, unticked, right, sc, 1, sides).length);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The scenario list of the setup, Random scenario first when two or more fit, and the choice it
|
|
104
|
+
// keeps, the current one while it still fits, else the default, else 5 against 5, else the first.
|
|
105
|
+
export function scenarioChoices(scenarios, teams, unticked, left, right, current, preferred, sides = null) {
|
|
106
|
+
const ok = fittingScenarios(scenarios, teams, unticked, left, right, sides);
|
|
107
|
+
const listed = ok.length > 1 ? [RANDOM, ...ok] : ok;
|
|
108
|
+
const keep = listed.includes(current) ? current
|
|
109
|
+
: ok.includes(preferred) ? preferred
|
|
110
|
+
: ok.includes('5_vs_5') ? '5_vs_5' : ok[0] || null;
|
|
111
|
+
return { listed, keep };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// The teams that a random side can draw, in the order of the registry, those of the pool that can
|
|
115
|
+
// play the side in the chosen scenario, or in a scenario that both sides can play when the
|
|
116
|
+
// scenario is random. The two sides take different teams whenever another team fits, unless a
|
|
117
|
+
// team may meet itself, as the server draws, src/cuju/render/_playing/draw.py.
|
|
118
|
+
export function drawableTeams(teams, unticked, state, side, scenarios, sides = null) {
|
|
119
|
+
const names = state.scenario === RANDOM
|
|
120
|
+
? fittingScenarios(scenarios.filter((sc) => sc !== RANDOM), teams, unticked, state.left, state.right, sides)
|
|
121
|
+
: [state.scenario];
|
|
122
|
+
const found = new Set();
|
|
123
|
+
for (const sc of names.filter(Boolean)) {
|
|
124
|
+
const lefts = sideTeams(teams, unticked, state.left, sc, 0, sides);
|
|
125
|
+
const rights = sideTeams(teams, unticked, state.right, sc, 1, sides);
|
|
126
|
+
const every = lefts.flatMap((l) => rights.map((r) => [l.id, r.id]));
|
|
127
|
+
const pairs = state.sameTeam ? every : every.filter(([l, r]) => l !== r);
|
|
128
|
+
(pairs.length ? pairs : every).forEach((pair) => found.add(pair[side]));
|
|
129
|
+
}
|
|
130
|
+
return teams.filter((x) => found.has(x.id));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Whether the setup draws anything, a side or the scenario.
|
|
134
|
+
export function drawsAny(state) {
|
|
135
|
+
return state.left === RANDOM || state.right === RANDOM || state.scenario === RANDOM;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// The request of Play match, which names the pool and whether a team may meet itself only when a
|
|
139
|
+
// side draws.
|
|
140
|
+
export function requestOf(state, teams, seed) {
|
|
141
|
+
const spec = {
|
|
142
|
+
left: state.left, right: state.right, scenario: state.scenario, seed,
|
|
143
|
+
ability: state.ability.slice(),
|
|
144
|
+
};
|
|
145
|
+
if (state.left === RANDOM || state.right === RANDOM) {
|
|
146
|
+
spec.pool = poolOf(teams, state.unticked);
|
|
147
|
+
spec.same_team = !!state.sameTeam;
|
|
148
|
+
}
|
|
149
|
+
return spec;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// The parts of a request that were drawn at random, by its draw, none for a request without.
|
|
153
|
+
export function drawnParts(r) {
|
|
154
|
+
const d = r && r.draw && typeof r.draw === 'object' ? r.draw : null;
|
|
155
|
+
const sides = d && Array.isArray(d.sides) ? d.sides : [];
|
|
156
|
+
return { left: sides[0] === true, right: sides[1] === true, scenario: !!(d && d.scenario === true) };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Whether a request draws anything at random.
|
|
160
|
+
export function wasDrawn(r) {
|
|
161
|
+
const parts = drawnParts(r);
|
|
162
|
+
return parts.left || parts.right || parts.scenario;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// The request of Retry or Repeat. Retry keeps the seed, so it draws the same teams and scenario
|
|
166
|
+
// again. Repeat of a match drawn at random leaves the seed to the server, which draws anew, and
|
|
167
|
+
// Repeat of any other match keeps its seed, as it always has.
|
|
168
|
+
export function againOf(r, repeat) {
|
|
169
|
+
const parts = drawnParts(r);
|
|
170
|
+
const spec = {
|
|
171
|
+
left: parts.left ? RANDOM : r.left, right: parts.right ? RANDOM : r.right,
|
|
172
|
+
scenario: parts.scenario ? RANDOM : r.scenario,
|
|
173
|
+
seed: repeat && wasDrawn(r) ? null : r.seed, ability: r.ability,
|
|
174
|
+
};
|
|
175
|
+
if (parts.left || parts.right) {
|
|
176
|
+
spec.pool = Array.isArray(r.draw.pool) ? r.draw.pool.slice() : null;
|
|
177
|
+
spec.same_team = r.draw.same_team === true;
|
|
178
|
+
}
|
|
179
|
+
return spec;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Whether a part of a request shows as Random, a part drawn at random of a match that has not
|
|
183
|
+
// started, one that waits or one that was cancelled or interrupted before it started. The teams
|
|
184
|
+
// and the scenario drawn show once the match starts.
|
|
185
|
+
export function hiddenPart(r, part) {
|
|
186
|
+
const unstarted = r.state === 'queued' || (r.state === 'failed' && typeof r.started !== 'number');
|
|
187
|
+
return unstarted && drawnParts(r)[part];
|
|
188
|
+
}
|