Co-op Planner

Up to 4 players · Task division · Resource coordination

Divide tasks across your Subnautica 2 co-op team. Assign roles and vehicles, click a task then a player to allocate work, and track resource totals and coverage. Your plan auto-saves to the URL for easy sharing.

New to co-op? Read our complete co-op strategies guide before planning.

Read Guide →
Report an Error

Player Setup

Edit names, roles, and vehicles

Role Templates

One-click role assignment for common 4-player splits.

0
Players
0
Total Tasks
0
Completed
0%
Progress

Task Assignment Board

14 tasks

Progress Summary

Click to Assign

Click a task to select it, then click a player card to assign. Click the same player again to unassign. Each task shows its owner's color.

Auto-Saves to URL

Every change is written to the page URL hash. Copy the share link and send it to your team to load the exact plan.

Vehicle Recommendations

The summary suggests a vehicle for each player based on their task mix, and flags mismatches with the assigned vehicle.

Related Tools

Sync & Share Plan

Share your 4-player plan with teammates via a code, or load a shared plan.

Generates a base64 plan code to share.

Replaces current plan with shared data.

'; } function exportPlan() { var data = { players: (typeof players !== 'undefined') ? players : [], tasks: (typeof tasks !== 'undefined') ? tasks : [], version: 'EA-0.1.0.0', ts: Date.now() }; var code = btoa(JSON.stringify(data)); document.getElementById('planExport').value = code; document.getElementById('planExport').select(); try { document.execCommand('copy'); showToast('Plan code copied'); } catch(e) { showToast('Plan code generated — copy manually'); } } function importPlan() { var raw = document.getElementById('planImport').value.trim(); if (!raw) { showToast('Paste a plan code first'); return; } try { var decoded = JSON.parse(atob(raw)); if (typeof players !== 'undefined') players = decoded.players || []; if (typeof tasks !== 'undefined') tasks = decoded.tasks || []; renderAll && renderAll(); showToast('Plan imported — '+players.length+' players, '+tasks.length+' tasks'); } catch(e) { showToast('Failed to decode plan code'); } } function showToast(msg) { var t = document.getElementById('coopToast'); if (!t) { t = document.createElement('div'); t.id = 'coopToast'; t.className = 'toast'; document.body.appendChild(t); } t.textContent = msg; t.classList.add('show'); setTimeout(function(){ t.classList.remove('show'); }, 2200); } function applyRoleTemplate(role) { var taskTemplates = { 'explorer':['Scan biome markers','Map 3 new biomes','Collect 5 Titanium Ore','Find scanner fragments'], 'builder':['Build seabase foundation','Set up Moonpool','Place solar panel','Craft Habitat Builder'], 'collector':['Hunt Peeper x10','Harvest Salt Deposit x20','Gather Copper Ore x30','Cook food for team'], 'defender':['Repair vehicle hulls','Monitor Reaper Leviathan signs','Carry Repair Tool','Mark hostile fauna on map'] }; var tasks = taskTemplates[role] || []; var roleLabel = role.charAt(0).toUpperCase() + role.slice(1); if (typeof tasks !== 'undefined') { tasks.forEach(function(desc) { tasks.push({ id:'t_'+Date.now()+'_'+Math.random().toString(36).slice(2,7), player:roleLabel, desc:desc, status:'pending' }); }); } renderAll && renderAll(); showToast('Added '+tasks.length+' tasks for '+roleLabel); } function updateStats() { var ps = (typeof players !== 'undefined') ? players.length : 0; var ts = (typeof tasks !== 'undefined') ? tasks.length : 0; var done = (typeof tasks !== 'undefined') ? tasks.filter(function(t){return t.status === 'done';}).length : 0; var pct = ts > 0 ? Math.round(done / ts * 100) : 0; var s1 = document.getElementById('statPlayers'); if (s1) s1.textContent = ps; var s2 = document.getElementById('statTasks'); if (s2) s2.textContent = ts; var s3 = document.getElementById('statDone'); if (s3) s3.textContent = done; var s4 = document.getElementById('statProgress'); if (s4) s4.textContent = pct + '%'; } loadState(); document.getElementById('playerCount').value=state.activePlayers; renderAll();