MUSA ARCADE // OPEN CITY CAREER GAME

JOB CITY
SIMULATOR 3D

Start with no job, pick a shift, complete tasks around the city and earn money and XP. Switch careers whenever you want and build up your worker level.

4 CAREERS
Delivery, courier, repair and warehouse shifts with level + streak bonuses.
LIVING CITY
3× larger city with districts, traffic, pedestrians and landmark hubs.
CASH + XP
Harder jobs pay more and raise your level.
TOUCH + PC
Joysticks on iPad, WASD + mouse on computer.
CASH$0
LEVEL1
XP0/100
JOBS DONE0
CAREERNONE
STREAK0
DISTANCE
FIND A JOBOpen the Jobs menu and choose your first shift.
MOVE
CAMERA
JOB BOARD

CHOOSE A SHIFT

WELCOME
+(current.pay+bonus)+(fast?' • FAST BONUS':'')+' • STREAK x'+streak);current=null;phase=0;marker.visible=false;$('#jobTitle').textContent='JOB COMPLETE';$('#jobText').textContent='Open JOBS to take another shift.';updateHud()}} $('#resetPos').onclick=()=>{avatar.position.set(0,0,0);toast('RETURNED TO CITY CENTER')};$('#interact').onclick=interact;addEventListener('keydown',e=>{if(e.code==='KeyE')interact();if(e.code==='KeyJ')openJobs()}); function blocked(x,z){return buildings.some(b=>Math.abs(x-b.x){$('#home').style.display='none';$('#hud').style.display='block';$('#controls').style.display='block';running=true;updateHud();toast('WELCOME TO JOB CITY')}; renderer.domElement.addEventListener('mousedown',()=>{if(window.MusaInput?.active==='keyboard')renderer.domElement.requestPointerLock?.()});addEventListener('mousemove',e=>{if(document.pointerLockElement===renderer.domElement)yaw-=e.movementX*.0024}); function loop(now){requestAnimationFrame(loop);const dt=Math.min(.04,(now-last)/1000);last=now;if(running){updateHud();const mi=window.MusaInput,kx=(mi?.down('KeyD')?1:0)-(mi?.down('KeyA')?1:0),ky=(mi?.down('KeyW')?1:0)-(mi?.down('KeyS')?1:0);const x=Math.abs(kx)?kx:moveX,y=Math.abs(ky)?ky:moveY;if(Math.abs(lookX)>.03)yaw-=lookX*dt*2.1;sprinting=sprinting||!!(mi?.down('ShiftLeft')||mi?.down('ShiftRight'));const f=new THREE.Vector3(-Math.sin(yaw),0,-Math.cos(yaw)),r=new THREE.Vector3(Math.cos(yaw),0,-Math.sin(yaw)),v=f.multiplyScalar(y).add(r.multiplyScalar(x));if(v.lengthSq()>1)v.normalize();const sp=(sprinting||performance.now(){camera.aspect=innerWidth/innerHeight;camera.updateProjectionMatrix();renderer.setSize(innerWidth,innerHeight)}); window.MUSA_GAME='Job City Simulator 3D';window.applyMusaCommand=function(c){if(c==='job_cash'){cash+=5000;localStorage.setItem('musa_job_cash',cash);updateHud();toast('ADMIN: +$5000')}if(c==='job_xp'){xp+=250;localStorage.setItem('musa_job_xp',xp);updateHud();toast('ADMIN: +250 XP')}if(c==='job_complete'&¤t){avatar.position.set(marker.position.x,0,marker.position.z);interact();toast('ADMIN: TASK ADVANCED')}if(c==='job_teleport'&¤t){avatar.position.set(marker.position.x,0,marker.position.z);toast('ADMIN: TELEPORTED')}if(c==='job_speed'){speedBoostUntil=performance.now()+12000;toast('ADMIN: SUPER SPEED')}};+cash;$('#level').textContent=level();$('#xp').textContent=(xp%100)+'/100';$('#done').textContent=done;$('#career').textContent=career||'NONE';$('#streak').textContent=streak;if(current){const left=Math.max(0,Math.ceil((jobDeadline-performance.now())/1000));$('#jobText').textContent=(phase===1?'Reach the pickup':'Reach the delivery point')+' • FAST BONUS '+left+'s'}} $('#start').onclick=()=>{$('#home').style.display='none';$('#hud').style.display='block';$('#controls').style.display='block';running=true;updateHud();toast('WELCOME TO JOB CITY')}; renderer.domElement.addEventListener('mousedown',()=>{if(window.MusaInput?.active==='keyboard')renderer.domElement.requestPointerLock?.()});addEventListener('mousemove',e=>{if(document.pointerLockElement===renderer.domElement)yaw-=e.movementX*.0024}); function loop(now){requestAnimationFrame(loop);const dt=Math.min(.04,(now-last)/1000);last=now;if(running){updateHud();const mi=window.MusaInput,kx=(mi?.down('KeyD')?1:0)-(mi?.down('KeyA')?1:0),ky=(mi?.down('KeyW')?1:0)-(mi?.down('KeyS')?1:0);const x=Math.abs(kx)?kx:moveX,y=Math.abs(ky)?ky:moveY;if(Math.abs(lookX)>.03)yaw-=lookX*dt*2.1;sprinting=sprinting||!!(mi?.down('ShiftLeft')||mi?.down('ShiftRight'));const f=new THREE.Vector3(-Math.sin(yaw),0,-Math.cos(yaw)),r=new THREE.Vector3(Math.cos(yaw),0,-Math.sin(yaw)),v=f.multiplyScalar(y).add(r.multiplyScalar(x));if(v.lengthSq()>1)v.normalize();const sp=(sprinting||performance.now(){camera.aspect=innerWidth/innerHeight;camera.updateProjectionMatrix();renderer.setSize(innerWidth,innerHeight)}); window.MUSA_GAME='Job City Simulator 3D';window.applyMusaCommand=function(c){if(c==='job_cash'){cash+=5000;localStorage.setItem('musa_job_cash',cash);updateHud();toast('ADMIN: +$5000')}if(c==='job_xp'){xp+=250;localStorage.setItem('musa_job_xp',xp);updateHud();toast('ADMIN: +250 XP')}if(c==='job_complete'&¤t){avatar.position.set(marker.position.x,0,marker.position.z);interact();toast('ADMIN: TASK ADVANCED')}if(c==='job_teleport'&¤t){avatar.position.set(marker.position.x,0,marker.position.z);toast('ADMIN: TELEPORTED')}if(c==='job_speed'){speedBoostUntil=performance.now()+12000;toast('ADMIN: SUPER SPEED')}};+(current.pay+bonus)+(fast?' • FAST BONUS':'')+' • STREAK x'+streak);current=null;phase=0;marker.visible=false;$('#jobTitle').textContent='JOB COMPLETE';$('#jobText').textContent='Open JOBS to take another shift.';updateHud()}} $('#resetPos').onclick=()=>{avatar.position.set(0,0,0);toast('RETURNED TO CITY CENTER')};$('#interact').onclick=interact;addEventListener('keydown',e=>{if(e.code==='KeyE')interact();if(e.code==='KeyJ')openJobs()}); function blocked(x,z){return buildings.some(b=>Math.abs(x-b.x){$('#home').style.display='none';$('#hud').style.display='block';$('#controls').style.display='block';running=true;updateHud();toast('WELCOME TO JOB CITY')}; renderer.domElement.addEventListener('mousedown',()=>{if(window.MusaInput?.active==='keyboard')renderer.domElement.requestPointerLock?.()});addEventListener('mousemove',e=>{if(document.pointerLockElement===renderer.domElement)yaw-=e.movementX*.0024}); function loop(now){requestAnimationFrame(loop);const dt=Math.min(.04,(now-last)/1000);last=now;if(running){updateHud();const mi=window.MusaInput,kx=(mi?.down('KeyD')?1:0)-(mi?.down('KeyA')?1:0),ky=(mi?.down('KeyW')?1:0)-(mi?.down('KeyS')?1:0);const x=Math.abs(kx)?kx:moveX,y=Math.abs(ky)?ky:moveY;if(Math.abs(lookX)>.03)yaw-=lookX*dt*2.1;sprinting=sprinting||!!(mi?.down('ShiftLeft')||mi?.down('ShiftRight'));const f=new THREE.Vector3(-Math.sin(yaw),0,-Math.cos(yaw)),r=new THREE.Vector3(Math.cos(yaw),0,-Math.sin(yaw)),v=f.multiplyScalar(y).add(r.multiplyScalar(x));if(v.lengthSq()>1)v.normalize();const sp=(sprinting||performance.now(){camera.aspect=innerWidth/innerHeight;camera.updateProjectionMatrix();renderer.setSize(innerWidth,innerHeight)}); window.MUSA_GAME='Job City Simulator 3D';window.applyMusaCommand=function(c){if(c==='job_cash'){cash+=5000;localStorage.setItem('musa_job_cash',cash);updateHud();toast('ADMIN: +$5000')}if(c==='job_xp'){xp+=250;localStorage.setItem('musa_job_xp',xp);updateHud();toast('ADMIN: +250 XP')}if(c==='job_complete'&¤t){avatar.position.set(marker.position.x,0,marker.position.z);interact();toast('ADMIN: TASK ADVANCED')}if(c==='job_teleport'&¤t){avatar.position.set(marker.position.x,0,marker.position.z);toast('ADMIN: TELEPORTED')}if(c==='job_speed'){speedBoostUntil=performance.now()+12000;toast('ADMIN: SUPER SPEED')}};