Когда я сохраняю комнату, сохраняется все внутри, особенно предметы, которые можно взять. Однако при загрузке сохранения, если я беру объект из комнаты и меняю комнату, та, в которой я был до этого, возвращается такая же, как и в сохранении (пересоздается список объектов, которые были там раньше, независимо от изменения, сделанные мною незадолго до этого)
это часть основного:
public static bool MainMenu()
{
bool exit = false;
bool ValidOption = false;
do
{
WriteLine("\tBENVENUTO IN FUGA DALLO SPAZIO\t\n\t\tcosa vuoi fare?\t\n\n[1] AVVIA NUOVA PARTITA\n[2] CARICA SALVTAGGIO\n[3] ESCI");
string? risposta = ReadLine();
switch (risposta)
{
case "1":
ValidOption = true;
NewGame();
exit = StartGame();
break;
case "2":
ValidOption = true;
string FileName = "PlayerSaves.json";
string jsonString = File.ReadAllText(FileName);
Global.Giocatore = JsonSerializer.Deserialize
(jsonString)!;
FileName = "RoomsSaves.json";
jsonString = File.ReadAllText(FileName);
Global.rooms = JsonSerializer.Deserialize(jsonString)!;
//ricreo le global aggiornate
Global.Inizio = Global.rooms[0];
Global.Stanza1 = Global.rooms[1];
Global.Stanza2 = Global.rooms[2];
Global.Stanza3 = Global.rooms[3];
Global.Stanza4 = Global.rooms[4];
Global.Stanza5 = Global.rooms[5];
Global.Stanza6 = Global.rooms[6];
Global.Stanza7 = Global.rooms[7];
Global.NULLA = Global.rooms[8];
FileName = "RobotSaves.json";
jsonString = File.ReadAllText(FileName);
Global.robot = JsonSerializer.Deserialize(jsonString)!;
FileName = "AlienSaves.json";
jsonString = File.ReadAllText(FileName);
Global.Alien = JsonSerializer.Deserialize(jsonString)!;
exit = StartGame();
break;
case "3":
ValidOption = true;
exit = true;
break;
}
} while (!ValidOption);
return !exit;
}
private static void NewGame()
{
//impostazione del nome del giocatore
WriteLine("Inserisci il nome del tuo personaggio:");
string? nome = ReadLine();
if (nome.Length == 0)
{
WriteLine("L'impatto deve averti scosso la testa così tanto da non farti nemmeno ricordare il nome.\nSulla tua tuta c'è una targhetta con su scirtto Charlie, Probabilmente è quello.");
nome = "Charlie";
}
nome.ToLower();
Global.Giocatore.Name = nome;
Global.Giocatore.Description = $"Hai addosso una tuta spaziale con un cartellino con su scritto {Global.Giocatore.Name}, è la tuta dell' agenzia che ti ha mandato qui,\n la \"D.O.M.\", un' agenzia che ha preso molto piede da quando la terra è passata al matriarcato";
//scelta difficoltà
bool difficultySetted = false;
do
{
WriteLine("Scegliere la difficolta a cui si vuole giocare:\n1. FACILE\n2. NORMALE\n3. DIFFICILE");
Global.Giocatore.Difficulty = Convert.ToInt32(Console.ReadLine());
if (Global.Giocatore.Difficulty == 1 || Global.Giocatore.Difficulty == 2 || Global.Giocatore.Difficulty == 3)
{
difficultySetted = true;
}
} while (!difficultySetted);
//imposta la vita dell'alieno in base alla difficoltà
int base_healt = Convert.ToInt32(ConfigurationManager.AppSettings["base_healt_alieno"]);
Global.Alien.Hp = base_healt * Global.Giocatore.Difficulty;
//pongo il danno delle armi prendendolo dall'app.config
Global.chiave_inglese.Danno = Convert.ToInt32(ConfigurationManager.AppSettings["Chiave_inglese_danno"]);
Global.pugnale.Danno = Convert.ToInt32(ConfigurationManager.AppSettings["Pugnale_danno"]);
Global.blaster.Danno = Convert.ToInt32(ConfigurationManager.AppSettings["Blaster_danno"]);
//inizio della partita
WriteLine("Prima di iniziare la partita ecco alcuni consigli:\n-L'inventario del giocatore segue la logica LIFO, ovvero potrai usare solo l'ultimo oggetto inserito" +
"\n-Il tuo scopo è trovare 4 oggetti (...), una volta ottenuti torna alla tua nave e usa il comando \"ripara\"" +
"\n-Non tutti gli oggetti nella stanza con cui puoi interagie compaiono sotto \"Oggetti particoalri visibili\", alcuni vengono citati nella descrizione della stanza" +
"\n-Alcuni oggetti hanno bisogno di essere aperti prima di poter sapere cosa contengono" +
"\n-Le risposte puoi scriverle sia in MAIUSCOLO che in minuscolo, inoltre gli articoli tra il verbo e l'oggetto non vengono considerati\n-Di seguito la lista dei comandi, buona fortuna!" +
"\n---------\nVai + [nord/sud/est/ovest] --> Muoversi per le stanze\nUsa + [Nome oggetto] --> Usare un oggetto dell'inventario" +
"\nPrendi/Raccogli + [Nome oggetto] --> Raccogliere un oggetto particolare che si trova nella stanza\nAttacca --> Attaccare il nemico" +
"\nEsamina + [Nome oggetto] --> Esaminare un oggetto\nApri + [Nome oggetto] --> Aprire porte o altro\nLascia/Togli --> Rimuovere l'oggetto in cima dall'inventario" +
"\nInventario --> Vedere quali oggetti hai nello zaino\nTeletrasporto --> usare la macchina del teletrasporto\nRipara ---> Per riparare la nave e vincere la partita" +
"\nHelp --> Aprire la lista comandi\nSave --> Salvare la partita\nQuit --> Uscire dal gioco\n---------\n");
//descrizione della storia
WriteLine($"\n\n\tIn una galassia lontana lontana...\t\nl'umanità ha raggiunto nuove frontiere nello spazio.\nUn coraggioso astronauta di nome {Global.Giocatore.Name} viene scelto per una missione vitale:" +
"\nesplorare un pianeta sconosciuto alla ricerca di risorse preziose.\nDurante il viaggio, accade qualcosa di terribile:\nun guasto catastrofico al motore provoca un brusco atterraggio di emergenza sul misterioso pianeta" +
"\n\nAncora frastornato dall'impatto, l'astronauta fa una scoperta inquietante: accanto alla sua navicella distrutta,\ngiace un'altra astronave, abbandonata e avvolta nel mistero.\nSenza altre opzioni," +
"\nl'astronauta non ha altra scelta se non avventurarsi all'interno di questa enigmatica nave spaziale.\n\nCosa troverà tra i corridoi oscuri e i macchinari arrugginiti?" +
"\nDovrai risolvere enigmi, affrontare pericoli sconosciuti e prestare attenzione a ciò che ti circonda\n per trovare le risorse necessarie a riparare la tua navicella.\nLa missione non sarà facile, una lotta contro la sopravvivenza ti attende.\n---------");
#region inserimento
//inserimento oggetti nelle stanze
Global.Inizio.ItemInRoom = Global.items_Inizio;
Global.Stanza1.ItemInRoom = Global.items_Stanza1;
Global.Stanza1.OtherItem = Global.Structural_items_stanza1;
Global.Stanza1.Doors = Global.Openable_items_stanza1;
Global.Stanza2.ItemInRoom = Global.items_Stanza2;
Global.Stanza2.OtherItem = Global.Structural_items_stanza2;
Global.Stanza2.Doors = Global.Openable_items_stanza2;
Global.Stanza3.ItemInRoom = Global.items_Stanza3;
Global.Stanza3.OtherItem = Global.Structural_items_stanza3;
Global.Stanza3.Doors = Global.Openable_items_stanza3;
Global.Stanza4.ItemInRoom = Global.items_Stanza4;
Global.Stanza4.OtherItem = Global.Structural_items_stanza4;
Global.Stanza4.Doors = Global.Openable_items_stanza4;
Global.Stanza5.ItemInRoom = Global.items_Stanza5;
Global.Stanza5.OtherItem = Global.Structural_items_stanza5;
Global.Stanza5.Doors = Global.Openable_items_stanza5;
Global.Stanza6.ItemInRoom = Global.items_Stanza6;
Global.Stanza6.OtherItem = Global.Structural_items_stanza6;
Global.Stanza6.Doors = Global.Openable_items_stanza6;
Global.Stanza7.ItemInRoom = Global.items_Stanza7;
Global.Stanza7.OtherItem = Global.Structural_items_stanza7;
Global.Stanza7.Doors = Global.Openable_items_stanza7;
#endregion
}
private static bool StartGame()
{
string? risposta;
bool quit = false;
//creo le connessioni tra le stanze
Connection IndottoInizio = new Connection(Global.NULLA, Global.NULLA,Global.Stanza4, Global.NULLA);
Connection Indotto1 = new Connection(Global.Stanza4, Global.NULLA, Global.Stanza2, Global.NULLA);
Connection Indotto2 = new Connection(Global.NULLA, Global.NULLA, Global.Stanza3, Global.Stanza1);
Connection Indotto3 = new Connection(Global.Stanza5, Global.NULLA, Global.NULLA, Global.Stanza2);
Connection Indotto4 = new Connection(Global.Stanza6, Global.Stanza1, Global.Stanza5, Global.Inizio);
Connection Indotto5 = new Connection(Global.NULLA, Global.Stanza3, Global.NULLA, Global.Stanza4);
Connection Indotto6 = new Connection(Global.NULLA, Global.Stanza4, Global.NULLA, Global.NULLA);
Connection Indotto7 = new Connection(Global.NULLA, Global.NULLA, Global.NULLA, Global.Stanza6);
//inserisco le connessioni nelle varie stanze
Global.Inizio.Direction =IndottoInizio;
Global.Stanza1.Direction = Indotto1;
Global.Stanza2.Direction = Indotto2;
Global.Stanza3.Direction = Indotto3;
Global.Stanza4.Direction = Indotto4;
Global.Stanza5.Direction = Indotto5;
Global.Stanza6.Direction = Indotto6;
Global.Stanza7.Direction = Indotto7;
if (Global.Stanza6.Doors[0].IsOpen)
{
Global.Stanza6.Direction.East = Global.Stanza7;
}
//imposto le connessioni alla stanza del giocatore, lo usero nei load
foreach (Room room in Global.rooms)
{
if (room.Name == Global.Giocatore.Position.Name)
{
Global.Giocatore.Position.Direction.North = room.Direction.North;
Global.Giocatore.Position.Direction.South = room.Direction.South;
Global.Giocatore.Position.Direction.East = room.Direction.East;
Global.Giocatore.Position.Direction.West = room.Direction.West;
break;
}
}
//ribalto l'inventario del giocatore dai load
if (Global.Giocatore.Inventario.Count > 1 )
{
List inventario = [];
while (Global.Giocatore.Inventario.Count != 0)
{
inventario.Add(Global.Giocatore.Inventario.Peek());
Global.Giocatore.Inventario.Pop();
}
for (int i = 0; i < inventario.Count; i++)
{
Global.Giocatore.Inventario.Push(inventario[i]);
}
}
//creo un array di stanze per il teletrasporto
List AllStanze = [Global.Stanza1, Global.Stanza3, Global.Stanza4, Global.Stanza5, Global.Stanza6];
#region ciclo di gioco
//ciclo di gioco
do
{
//Descrivo dove si trova il giocatore e cosa vede
WriteLine("---------");
WriteLine(Global.Giocatore.Position.Name);
WriteLine(Global.Giocatore.Position.Description);
if (Global.Giocatore.Position.ItemInRoom != null && Global.Giocatore.Position.ItemInRoom.Count != 0)
{
//WriteLine(Global.Stanza4.ItemInRoom[0].Name);
Global.Giocatore.Position.RoomItem(Global.Giocatore.Position);
}
else
{
WriteLine("Nessun oggetto particolare è visibile");
}
WriteLine("---------");
Я подозреваю, что проблема связана с глобальными комнатами, я провел различные тесты, но комнаты, которые я загружаю из сохранений, похоже, без проблем подключаются к глобальным комнатам
Когда я сохраняю комнату, сохраняется все внутри, особенно предметы, которые можно взять. Однако при загрузке сохранения, если я беру объект из комнаты и меняю комнату, та, в которой я был до этого, возвращается такая же, как и в сохранении (пересоздается список объектов, которые были там раньше, независимо от изменения, сделанные мною незадолго до этого) это часть основного: [code] public static bool MainMenu() { bool exit = false; bool ValidOption = false; do { WriteLine("\tBENVENUTO IN FUGA DALLO SPAZIO\t\n\t\tcosa vuoi fare?\t\n\n[1] AVVIA NUOVA PARTITA\n[2] CARICA SALVTAGGIO\n[3] ESCI"); string? risposta = ReadLine();
FileName = "AlienSaves.json"; jsonString = File.ReadAllText(FileName); Global.Alien = JsonSerializer.Deserialize(jsonString)!; exit = StartGame(); break; case "3": ValidOption = true; exit = true; break; } } while (!ValidOption); return !exit; } private static void NewGame() { //impostazione del nome del giocatore WriteLine("Inserisci il nome del tuo personaggio:"); string? nome = ReadLine(); if (nome.Length == 0) { WriteLine("L'impatto deve averti scosso la testa così tanto da non farti nemmeno ricordare il nome.\nSulla tua tuta c'è una targhetta con su scirtto Charlie, Probabilmente è quello."); nome = "Charlie"; } nome.ToLower(); Global.Giocatore.Name = nome; Global.Giocatore.Description = $"Hai addosso una tuta spaziale con un cartellino con su scritto {Global.Giocatore.Name}, è la tuta dell' agenzia che ti ha mandato qui,\n la \"D.O.M.\", un' agenzia che ha preso molto piede da quando la terra è passata al matriarcato"; //scelta difficoltà bool difficultySetted = false; do { WriteLine("Scegliere la difficolta a cui si vuole giocare:\n1. FACILE\n2. NORMALE\n3. DIFFICILE"); Global.Giocatore.Difficulty = Convert.ToInt32(Console.ReadLine()); if (Global.Giocatore.Difficulty == 1 || Global.Giocatore.Difficulty == 2 || Global.Giocatore.Difficulty == 3) { difficultySetted = true; } } while (!difficultySetted); //imposta la vita dell'alieno in base alla difficoltà int base_healt = Convert.ToInt32(ConfigurationManager.AppSettings["base_healt_alieno"]); Global.Alien.Hp = base_healt * Global.Giocatore.Difficulty; //pongo il danno delle armi prendendolo dall'app.config Global.chiave_inglese.Danno = Convert.ToInt32(ConfigurationManager.AppSettings["Chiave_inglese_danno"]); Global.pugnale.Danno = Convert.ToInt32(ConfigurationManager.AppSettings["Pugnale_danno"]); Global.blaster.Danno = Convert.ToInt32(ConfigurationManager.AppSettings["Blaster_danno"]); //inizio della partita WriteLine("Prima di iniziare la partita ecco alcuni consigli:\n-L'inventario del giocatore segue la logica LIFO, ovvero potrai usare solo l'ultimo oggetto inserito" + "\n-Il tuo scopo è trovare 4 oggetti (...), una volta ottenuti torna alla tua nave e usa il comando \"ripara\"" + "\n-Non tutti gli oggetti nella stanza con cui puoi interagie compaiono sotto \"Oggetti particoalri visibili\", alcuni vengono citati nella descrizione della stanza" + "\n-Alcuni oggetti hanno bisogno di essere aperti prima di poter sapere cosa contengono" + "\n-Le risposte puoi scriverle sia in MAIUSCOLO che in minuscolo, inoltre gli articoli tra il verbo e l'oggetto non vengono considerati\n-Di seguito la lista dei comandi, buona fortuna!" + "\n---------\nVai + [nord/sud/est/ovest] --> Muoversi per le stanze\nUsa + [Nome oggetto] --> Usare un oggetto dell'inventario" + "\nPrendi/Raccogli + [Nome oggetto] --> Raccogliere un oggetto particolare che si trova nella stanza\nAttacca --> Attaccare il nemico" + "\nEsamina + [Nome oggetto] --> Esaminare un oggetto\nApri + [Nome oggetto] --> Aprire porte o altro\nLascia/Togli --> Rimuovere l'oggetto in cima dall'inventario" + "\nInventario --> Vedere quali oggetti hai nello zaino\nTeletrasporto --> usare la macchina del teletrasporto\nRipara ---> Per riparare la nave e vincere la partita" + "\nHelp --> Aprire la lista comandi\nSave --> Salvare la partita\nQuit --> Uscire dal gioco\n---------\n"); //descrizione della storia WriteLine($"\n\n\tIn una galassia lontana lontana...\t\nl'umanità ha raggiunto nuove frontiere nello spazio.\nUn coraggioso astronauta di nome {Global.Giocatore.Name} viene scelto per una missione vitale:" + "\nesplorare un pianeta sconosciuto alla ricerca di risorse preziose.\nDurante il viaggio, accade qualcosa di terribile:\nun guasto catastrofico al motore provoca un brusco atterraggio di emergenza sul misterioso pianeta" + "\n\nAncora frastornato dall'impatto, l'astronauta fa una scoperta inquietante: accanto alla sua navicella distrutta,\ngiace un'altra astronave, abbandonata e avvolta nel mistero.\nSenza altre opzioni," + "\nl'astronauta non ha altra scelta se non avventurarsi all'interno di questa enigmatica nave spaziale.\n\nCosa troverà tra i corridoi oscuri e i macchinari arrugginiti?" + "\nDovrai risolvere enigmi, affrontare pericoli sconosciuti e prestare attenzione a ciò che ti circonda\n per trovare le risorse necessarie a riparare la tua navicella.\nLa missione non sarà facile, una lotta contro la sopravvivenza ti attende.\n---------"); #region inserimento //inserimento oggetti nelle stanze Global.Inizio.ItemInRoom = Global.items_Inizio;
//creo le connessioni tra le stanze Connection IndottoInizio = new Connection(Global.NULLA, Global.NULLA,Global.Stanza4, Global.NULLA); Connection Indotto1 = new Connection(Global.Stanza4, Global.NULLA, Global.Stanza2, Global.NULLA); Connection Indotto2 = new Connection(Global.NULLA, Global.NULLA, Global.Stanza3, Global.Stanza1); Connection Indotto3 = new Connection(Global.Stanza5, Global.NULLA, Global.NULLA, Global.Stanza2); Connection Indotto4 = new Connection(Global.Stanza6, Global.Stanza1, Global.Stanza5, Global.Inizio); Connection Indotto5 = new Connection(Global.NULLA, Global.Stanza3, Global.NULLA, Global.Stanza4); Connection Indotto6 = new Connection(Global.NULLA, Global.Stanza4, Global.NULLA, Global.NULLA); Connection Indotto7 = new Connection(Global.NULLA, Global.NULLA, Global.NULLA, Global.Stanza6); //inserisco le connessioni nelle varie stanze Global.Inizio.Direction =IndottoInizio; Global.Stanza1.Direction = Indotto1; Global.Stanza2.Direction = Indotto2; Global.Stanza3.Direction = Indotto3; Global.Stanza4.Direction = Indotto4; Global.Stanza5.Direction = Indotto5; Global.Stanza6.Direction = Indotto6; Global.Stanza7.Direction = Indotto7; if (Global.Stanza6.Doors[0].IsOpen) { Global.Stanza6.Direction.East = Global.Stanza7; }
//imposto le connessioni alla stanza del giocatore, lo usero nei load foreach (Room room in Global.rooms) { if (room.Name == Global.Giocatore.Position.Name) { Global.Giocatore.Position.Direction.North = room.Direction.North; Global.Giocatore.Position.Direction.South = room.Direction.South; Global.Giocatore.Position.Direction.East = room.Direction.East; Global.Giocatore.Position.Direction.West = room.Direction.West; break; } } //ribalto l'inventario del giocatore dai load if (Global.Giocatore.Inventario.Count > 1 ) { List inventario = []; while (Global.Giocatore.Inventario.Count != 0) { inventario.Add(Global.Giocatore.Inventario.Peek()); Global.Giocatore.Inventario.Pop(); } for (int i = 0; i < inventario.Count; i++) { Global.Giocatore.Inventario.Push(inventario[i]); } } //creo un array di stanze per il teletrasporto List AllStanze = [Global.Stanza1, Global.Stanza3, Global.Stanza4, Global.Stanza5, Global.Stanza6]; #region ciclo di gioco //ciclo di gioco do {
//Descrivo dove si trova il giocatore e cosa vede WriteLine("---------"); WriteLine(Global.Giocatore.Position.Name); WriteLine(Global.Giocatore.Position.Description); if (Global.Giocatore.Position.ItemInRoom != null && Global.Giocatore.Position.ItemInRoom.Count != 0) { //WriteLine(Global.Stanza4.ItemInRoom[0].Name);
Global.Giocatore.Position.RoomItem(Global.Giocatore.Position); } else { WriteLine("Nessun oggetto particolare è visibile"); } WriteLine("---------"); [/code] Я подозреваю, что проблема связана с глобальными комнатами, я провел различные тесты, но комнаты, которые я загружаю из сохранений, похоже, без проблем подключаются к глобальным комнатам