feat(city): add player marketplace, mission journal, character customization and presence

- Player-to-player marketplace with listings, buying and selling
- Mission system with progress tracking and money rewards
- Character appearance customization (skin, hair, face, beard, accessory)
- Multiplayer presence feed showing nearby citizens in near-real-time
- Admin world dashboard with live platform metrics
- Bus and train transportation with temporary ride state
- Mobile joystick controls and minimap HUD
- Education bonus applied to work salary
This commit is contained in:
2026-10-17 22:51:20 -03:00
parent 18778b3d26
commit a620f83dd8
30 changed files with 1822 additions and 10 deletions
@@ -0,0 +1,43 @@
@extends('layouts.app')
@section('title', __('admin.world.title'))
@section('content')
<div style="max-width: 1000px; margin: 0 auto;">
<div class="card" style="margin-bottom:1.25rem;">
<h1 style="margin-top:0; color:#fff;">🌍 {{ __('admin.world.title') }}</h1>
<p style="color:var(--muted);">{{ __('admin.world.hint') }}</p>
</div>
<div style="display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:1rem;">
@foreach ([
['title' => __('admin.world.users'), 'value' => $metrics['users']['total'],
'sub' => $metrics['users']['pending'].' pending · '.$metrics['users']['active'].' active · '.$metrics['users']['banned'].' banned'],
['title' => __('admin.world.characters'), 'value' => $metrics['characters']['total'],
'sub' => $metrics['characters']['online'].' online · '.$metrics['characters']['hospitalized'].' hospital'],
['title' => __('admin.world.economy'), 'value' => $metrics['characters']['total_money'],
'sub' => __('admin.world.trade_volume').': '.$metrics['world']['transaction_volume']],
['title' => __('admin.world.world'), 'value' => $metrics['world']['houses_complete'],
'sub' => $metrics['world']['stores'].' stores · '.$metrics['world']['jobs'].' jobs · '.$metrics['world']['messages'].' msgs'],
['title' => __('admin.world.market'), 'value' => $metrics['market']['listings'],
'sub' => __('admin.world.missions').': '.$metrics['missions']['completed'].' done / '.$metrics['missions']['active']],
['title' => __('admin.world.health'), 'value' => $metrics['characters']['avg_health'],
'sub' => __('admin.world.education').': '.$metrics['characters']['avg_education'].'%'],
] as $card)
<div class="card" style="margin:0;">
<div style="color:var(--muted); font-size:.85rem;">{{ $card['title'] }}</div>
<div style="color:#fff; font-size:1.8rem; font-weight:700;">{{ $card['value'] }}</div>
<div style="color:var(--muted); font-size:.8rem; margin-top:.25rem;">{{ $card['sub'] }}</div>
</div>
@endforeach
</div>
<div class="card" style="margin-top:1.25rem;">
<p style="color:var(--muted); margin:0;">
<code>php artisan city:report</code> ·
<a href="{{ route('admin.citizens.index') }}" style="color:#7dd3fc;">{{ __('nav.citizens') }}</a> ·
<a href="{{ route('admin.cities.index') }}" style="color:#7dd3fc;">{{ __('nav.cities') }}</a>
</p>
</div>
</div>
@endsection