11<script setup lang="ts">
2- import { onMounted , watch , ref } from ' vue'
2+ import { onMounted , onUnmounted , watch , ref } from ' vue'
33import { useRoute , useRouter } from ' vue-router'
44import { useFgoStore } from ' @/stores/fgo'
55import { useScriptPlayer } from ' @/composables/useScriptPlayer'
@@ -12,6 +12,27 @@ const player = useScriptPlayer()
1212const debugMode = ref (true )
1313const showSettings = ref (false )
1414
15+ const containerRef = ref <HTMLElement | null >(null )
16+ const gameScreenScale = ref (1 )
17+
18+ const updateScale = () => {
19+ if (! containerRef .value ) return
20+ const parentW = containerRef .value .clientWidth
21+ const parentH = containerRef .value .clientHeight
22+
23+ // If dimensions are 0 (e.g. hidden), skip
24+ if (parentW === 0 || parentH === 0 ) return
25+
26+ const targetW = 1024
27+ const targetH = 626
28+
29+ const scaleW = parentW / targetW
30+ const scaleH = parentH / targetH
31+
32+ // Fit inside (contain)
33+ gameScreenScale .value = Math .min (scaleW , scaleH )
34+ }
35+
1536const loadScript = async () => {
1637 const questId = Number (route .params .questId )
1738 const phase = Number (route .params .phase )
@@ -29,8 +50,29 @@ const loadScript = async () => {
2950 }
3051}
3152
53+ let resizeObserver: ResizeObserver | null = null
54+
3255onMounted (() => {
3356 loadScript ()
57+
58+ // Use ResizeObserver to detect container size changes
59+ if (containerRef .value ) {
60+ resizeObserver = new ResizeObserver (() => {
61+ updateScale ()
62+ })
63+ resizeObserver .observe (containerRef .value )
64+ }
65+
66+ window .addEventListener (' resize' , updateScale )
67+ // Initial scale update
68+ setTimeout (updateScale , 100 )
69+ })
70+
71+ onUnmounted (() => {
72+ if (resizeObserver ) {
73+ resizeObserver .disconnect ()
74+ }
75+ window .removeEventListener (' resize' , updateScale )
3476})
3577
3678watch (
@@ -101,10 +143,15 @@ const exit = () => {
101143 </script >
102144
103145<template >
104- <div class =" player-container" >
146+ <div class =" player-container" ref = " containerRef " >
105147 <div v-if =" store.isLoading" class =" loading" >Loading Script...</div >
106148 <div v-else-if =" store.error" class =" error" >{{ store.error }}</div >
107- <div v-else-if =" store.currentQuest" class =" game-screen" @click =" player.next()" >
149+ <div
150+ v-else-if =" store.currentQuest"
151+ class =" game-screen"
152+ @click =" player.next()"
153+ :style =" { transform: `scale(${gameScreenScale})` }"
154+ >
108155 <!-- Background Layer -->
109156 <div
110157 class =" background"
@@ -175,33 +222,32 @@ const exit = () => {
175222
176223<style scoped>
177224.player-container {
178- position : fixed ;
225+ position : absolute ;
179226 top : 0 ;
180227 left : 0 ;
181228 z-index : 1000 ;
182- width : 100 vw ;
183- height : 100 vh ;
229+ width : 100 % ;
230+ height : 100 % ;
184231 background : #000 ;
185232 color : white ;
186233 display : flex ;
187234 justify-content : center ;
188235 align-items : center ;
236+ overflow : hidden ;
189237}
190238
191239.game-screen {
192240 position : relative ;
193- width : 100% ;
194- height : 100% ;
195- max-width : 1024px ;
196- max-height : 626px ;
241+ width : 1024px ;
242+ height : 626px ;
197243 background : #333 ;
198244 overflow : hidden ;
199245 cursor : pointer ;
200- aspect-ratio : 1024 / 626 ;
201246 user-select : none ;
202247 -webkit-user-select : none ;
203248 -moz-user-select : none ;
204249 -ms-user-select : none ;
250+ flex-shrink : 0 ;
205251}
206252
207253.background {
0 commit comments