shrani
This commit is contained in:
340
docs/guides/STEAM_INTEGRATION_PLAN.md
Normal file
340
docs/guides/STEAM_INTEGRATION_PLAN.md
Normal file
@@ -0,0 +1,340 @@
|
||||
# 🎮 STEAM INTEGRATION - GREENWORKS SDK
|
||||
|
||||
**Datum:** 12. December 2025
|
||||
**Prioriteta:** LOW (za Steam release)
|
||||
**Estimated Time:** 2-3 ure
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **CILJ:**
|
||||
|
||||
Integracija Greenworks SDK za Steam funkcionalnosti:
|
||||
- Cloud Save Sync
|
||||
- Achievements
|
||||
- Offline vs Online mode
|
||||
|
||||
---
|
||||
|
||||
## 📋 **IMPLEMENTATION:**
|
||||
|
||||
### **1. Greenworks SDK Setup** (30 min)
|
||||
|
||||
**Install:**
|
||||
```bash
|
||||
npm install greenworks --save
|
||||
```
|
||||
|
||||
**Package.json:**
|
||||
```json
|
||||
{
|
||||
"dependencies": {
|
||||
"greenworks": "^0.18.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Main.js (Electron):**
|
||||
```javascript
|
||||
const greenworks = require('./greenworks');
|
||||
|
||||
if (greenworks.init()) {
|
||||
console.log('✅ Steam initialized!');
|
||||
console.log('Steam ID:', greenworks.getSteamId().steamId);
|
||||
} else {
|
||||
console.log('⚠️ Steam not running or game not launched via Steam');
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### **2. Cloud Save Sync** (60 min)
|
||||
|
||||
**SteamCloudSystem.js:**
|
||||
```javascript
|
||||
class SteamCloudSystem {
|
||||
constructor() {
|
||||
this.enabled = false;
|
||||
this.steamId = null;
|
||||
|
||||
if (typeof greenworks !== 'undefined') {
|
||||
this.enabled = greenworks.init();
|
||||
if (this.enabled) {
|
||||
this.steamId = greenworks.getSteamId().steamId;
|
||||
console.log('☁️ Steam Cloud: Enabled');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Save to Steam Cloud
|
||||
saveToCloud(filename, data) {
|
||||
if (!this.enabled) {
|
||||
console.log('⚠️ Steam Cloud not available');
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
const json = JSON.stringify(data);
|
||||
greenworks.saveTextToFile(filename, json, (err) => {
|
||||
if (err) {
|
||||
console.error('❌ Cloud save failed:', err);
|
||||
} else {
|
||||
console.log('✅ Saved to Steam Cloud:', filename);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
} catch (e) {
|
||||
console.error('❌ Cloud save error:', e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Load from Steam Cloud
|
||||
loadFromCloud(filename, callback) {
|
||||
if (!this.enabled) {
|
||||
console.log('⚠️ Steam Cloud not available');
|
||||
callback(null);
|
||||
return;
|
||||
}
|
||||
|
||||
greenworks.readTextFromFile(filename, (err, data) => {
|
||||
if (err) {
|
||||
console.error('❌ Cloud load failed:', err);
|
||||
callback(null);
|
||||
} else {
|
||||
try {
|
||||
const parsed = JSON.parse(data);
|
||||
console.log('✅ Loaded from Steam Cloud:', filename);
|
||||
callback(parsed);
|
||||
} catch (e) {
|
||||
console.error('❌ Cloud parse error:', e);
|
||||
callback(null);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Check if file exists in cloud
|
||||
fileExists(filename, callback) {
|
||||
if (!this.enabled) {
|
||||
callback(false);
|
||||
return;
|
||||
}
|
||||
|
||||
greenworks.isCloudEnabledForUser((enabled) => {
|
||||
if (!enabled) {
|
||||
callback(false);
|
||||
return;
|
||||
}
|
||||
|
||||
greenworks.getFileCount((count) => {
|
||||
// Check if file exists
|
||||
// (Greenworks doesn't have direct exists check)
|
||||
this.loadFromCloud(filename, (data) => {
|
||||
callback(data !== null);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### **3. Offline vs Online Mode** (30 min)
|
||||
|
||||
**Connection Detection:**
|
||||
```javascript
|
||||
class ConnectionSystem {
|
||||
constructor() {
|
||||
this.isOnline = navigator.onLine;
|
||||
this.isSteamOnline = false;
|
||||
|
||||
// Check Steam connection
|
||||
if (typeof greenworks !== 'undefined' && greenworks.init()) {
|
||||
this.isSteamOnline = true;
|
||||
}
|
||||
|
||||
// Listen for connection changes
|
||||
window.addEventListener('online', () => {
|
||||
this.isOnline = true;
|
||||
console.log('🌐 Connection: Online');
|
||||
});
|
||||
|
||||
window.addEventListener('offline', () => {
|
||||
this.isOnline = false;
|
||||
console.log('📴 Connection: Offline');
|
||||
});
|
||||
|
||||
console.log(`🌐 Connection: ${this.isOnline ? 'Online' : 'Offline'}`);
|
||||
console.log(`🎮 Steam: ${this.isSteamOnline ? 'Online' : 'Offline'}`);
|
||||
}
|
||||
|
||||
// Save strategy: Cloud if online, local if offline
|
||||
saveGame(data) {
|
||||
if (this.isSteamOnline) {
|
||||
// Try cloud save first
|
||||
steamCloudSystem.saveToCloud('savegame.json', data);
|
||||
}
|
||||
|
||||
// Always save locally as backup
|
||||
localStorage.setItem('novafarma_savefile', JSON.stringify(data));
|
||||
|
||||
console.log('💾 Game saved (Cloud + Local)');
|
||||
}
|
||||
|
||||
// Load strategy: Cloud if available, fallback to local
|
||||
loadGame(callback) {
|
||||
if (this.isSteamOnline) {
|
||||
// Try cloud load
|
||||
steamCloudSystem.loadFromCloud('savegame.json', (cloudData) => {
|
||||
if (cloudData) {
|
||||
console.log('☁️ Loaded from Steam Cloud');
|
||||
callback(cloudData);
|
||||
} else {
|
||||
// Fallback to local
|
||||
this.loadLocal(callback);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// Load local
|
||||
this.loadLocal(callback);
|
||||
}
|
||||
}
|
||||
|
||||
loadLocal(callback) {
|
||||
const data = localStorage.getItem('novafarma_savefile');
|
||||
if (data) {
|
||||
console.log('💾 Loaded from local storage');
|
||||
callback(JSON.parse(data));
|
||||
} else {
|
||||
callback(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### **4. Testing** (30 min)
|
||||
|
||||
**Test Cases:**
|
||||
|
||||
**A. Cloud Sync Test:**
|
||||
```javascript
|
||||
// Test 1: Save to cloud
|
||||
steamCloudSystem.saveToCloud('test.json', { test: 'data' });
|
||||
|
||||
// Test 2: Load from cloud
|
||||
steamCloudSystem.loadFromCloud('test.json', (data) => {
|
||||
console.log('Loaded:', data);
|
||||
});
|
||||
|
||||
// Test 3: File exists check
|
||||
steamCloudSystem.fileExists('test.json', (exists) => {
|
||||
console.log('File exists:', exists);
|
||||
});
|
||||
```
|
||||
|
||||
**B. Offline/Online Test:**
|
||||
```javascript
|
||||
// Test 1: Save while online
|
||||
connectionSystem.saveGame({ player: 'data' });
|
||||
|
||||
// Test 2: Disconnect (simulate offline)
|
||||
// - Disable network in browser DevTools
|
||||
// - Try to save again
|
||||
connectionSystem.saveGame({ player: 'data2' });
|
||||
|
||||
// Test 3: Reconnect
|
||||
// - Enable network
|
||||
// - Load game
|
||||
connectionSystem.loadGame((data) => {
|
||||
console.log('Loaded:', data);
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 **INTEGRATION:**
|
||||
|
||||
**GameScene.js:**
|
||||
```javascript
|
||||
// In create():
|
||||
if (typeof greenworks !== 'undefined') {
|
||||
this.steamCloudSystem = new SteamCloudSystem();
|
||||
this.connectionSystem = new ConnectionSystem();
|
||||
}
|
||||
|
||||
// Replace existing save/load:
|
||||
saveGame() {
|
||||
const data = this.saveSystem.getSaveData();
|
||||
|
||||
if (this.connectionSystem) {
|
||||
this.connectionSystem.saveGame(data);
|
||||
} else {
|
||||
// Fallback to local only
|
||||
localStorage.setItem('novafarma_savefile', JSON.stringify(data));
|
||||
}
|
||||
}
|
||||
|
||||
loadGame() {
|
||||
if (this.connectionSystem) {
|
||||
this.connectionSystem.loadGame((data) => {
|
||||
if (data) {
|
||||
this.saveSystem.loadSaveData(data);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// Fallback to local only
|
||||
const data = localStorage.getItem('novafarma_savefile');
|
||||
if (data) {
|
||||
this.saveSystem.loadSaveData(JSON.parse(data));
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 **DATOTEKE:**
|
||||
|
||||
**Nove:**
|
||||
- `src/systems/SteamCloudSystem.js` (~150 vrstic)
|
||||
- `src/systems/ConnectionSystem.js` (~100 vrstic)
|
||||
|
||||
**Posodobljene:**
|
||||
- `package.json` - Greenworks dependency
|
||||
- `main.js` - Greenworks init
|
||||
- `GameScene.js` - Integration
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ **POMEMBNO:**
|
||||
|
||||
**Greenworks zahteva:**
|
||||
1. Steam Client running
|
||||
2. Game launched via Steam
|
||||
3. Valid Steam App ID
|
||||
4. Steam SDK files
|
||||
|
||||
**Za testiranje brez Steama:**
|
||||
- Sistem bo avtomatsko fallback na local storage
|
||||
- Vse deluje tudi brez Steama
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **PRIORITETA:**
|
||||
|
||||
**LOW** - Potrebno samo za Steam release.
|
||||
|
||||
**Priporočam:** Implementacija pred Steam release, ne zdaj.
|
||||
|
||||
---
|
||||
|
||||
**Status:** ⏳ **PLAN PRIPRAVLJEN**
|
||||
|
||||
**Estimated time:** 2-3 ure
|
||||
|
||||
**Kdaj:** Pred Steam release (ne kritično za testiranje)
|
||||
|
||||
Želite implementacijo zdaj ali kasneje? 🎮
|
||||
Reference in New Issue
Block a user