update
This commit is contained in:
@@ -2,17 +2,17 @@ class_name NetState
|
||||
## Serialisierter Spielzustand für das Netzwerk (ausgelagert aus den Spielregeln).
|
||||
|
||||
|
||||
## Serialisierter Zustand aus Sicht eines Spielers: fremde Hände nur als Anzahl, fremde Läden gar nicht.
|
||||
## viewer -1: alles sichtbar (Spielstand, Host-Wechsel); -2: nichts Verborgenes (Zuschauer).
|
||||
## Karten reisen als ID; verschmolzene stehen nicht im Pool und gehen als Ganzes mit.
|
||||
## Karten reisen als ID; eigene Exemplare mit Schlüsselwörtern und verschmolzene als Ganzes.
|
||||
static func card_ref(c: Cards.Card):
|
||||
return c.id if Cards.has_id(c.id) else c.to_dict()
|
||||
return c.id if Cards.has_id(c.id) and c.keywords.is_empty() and c.fusions == 0 else c.to_dict()
|
||||
|
||||
|
||||
static func card_of(ref) -> Cards.Card:
|
||||
return Cards.Card.from_dict(ref) if ref is Dictionary else Cards.by_id(ref)
|
||||
return Cards.Card.from_dict(ref) if ref is Dictionary else Cards.by_id(ref).copy()
|
||||
|
||||
|
||||
## Zustand aus Sicht eines Spielers: fremde Hand nur als Anzahl, fremde Wahl gar nicht, fremde
|
||||
## verdeckte Wesen ohne Karte und Werte. viewer -1: alles sichtbar (Host-Wechsel); -2: Zuschauer.
|
||||
static func snapshot(g: Game, viewer: int) -> Dictionary:
|
||||
var ps := []
|
||||
for i in g.players.size():
|
||||
@@ -20,15 +20,16 @@ static func snapshot(g: Game, viewer: int) -> Dictionary:
|
||||
var mine := i == viewer or viewer == -1
|
||||
var board := []
|
||||
for c in p.board:
|
||||
board.append({"uid": c.uid, "card": card_ref(c.card),
|
||||
"attack": c.attack, "resonance": c.resonance, "field_bonus": c.field_bonus,
|
||||
"health": c.health, "max_health": c.max_health, "shield": c.shield, "frozen": c.frozen,
|
||||
"ready": c.ready, "attacks_left": c.attacks_left})
|
||||
var masked: bool = c.hidden and not mine
|
||||
board.append({"uid": c.uid, "card": card_ref(Cards.unknown() if masked else c.card),
|
||||
"attack": 0 if masked else c.attack, "health": 0 if masked else c.health,
|
||||
"max_health": 0 if masked else c.max_health, "shield": c.shield and not masked,
|
||||
"attacks_left": c.attacks_left, "hidden": c.hidden, "aura": c.aura})
|
||||
ps.append({"name": p.name, "title": p.title, "is_human": p.is_human, "life": p.life, "max_life": p.max_life,
|
||||
"energy": p.energy, "max_energy": p.max_energy, "start_bonus": p.start_bonus,
|
||||
"order": p.order, "perks": p.perks, "elements": p.elements, "looks": p.looks, "turns": p.turns,
|
||||
"order": p.order, "perks": p.perks, "looks": p.looks, "turns": p.turns,
|
||||
"hand": p.hand.map(card_ref) if mine else p.hand.size(),
|
||||
"shop": p.shop.map(func(c): return c.id if c != null else "") if mine else [],
|
||||
"offer": p.offer.map(func(c): return c.id) if mine else [], "picks_left": p.picks_left,
|
||||
"board": board})
|
||||
var evs := []
|
||||
for ev in g.events:
|
||||
@@ -38,7 +39,7 @@ static func snapshot(g: Game, viewer: int) -> Dictionary:
|
||||
evs.append(e)
|
||||
return {"players": ps, "human": g.players.find(g.human), "turn": g.turn, "current_idx": g.current_idx,
|
||||
"winner": g.winner, "winner_player": g.players.find(g.winner_player) if g.winner_player != null else -1,
|
||||
"next_uid": g.next_uid, "field_element": g.field_element, "field_charge": g.field_charge,
|
||||
"next_uid": g.next_uid, "deck_size": g.deck.size(),
|
||||
"log": g.log.slice(maxi(0, g.log.size() - 80)), "events": evs}
|
||||
|
||||
|
||||
@@ -47,7 +48,7 @@ static func from_snapshot(d: Dictionary) -> Game:
|
||||
var placeholder: Cards.Card = Cards.all()[0]
|
||||
var list := []
|
||||
for pd in d.players:
|
||||
var p := Game.Player.new(pd.name, pd.is_human, int(pd.life), pd.title, Array(pd.get("elements", [])))
|
||||
var p := Game.Player.new(pd.name, pd.is_human, int(pd.life), pd.title)
|
||||
p.max_life = int(pd.max_life)
|
||||
p.energy = int(pd.energy)
|
||||
p.max_energy = int(pd.max_energy)
|
||||
@@ -63,20 +64,19 @@ static func from_snapshot(d: Dictionary) -> Game:
|
||||
else:
|
||||
for i in int(pd.hand):
|
||||
p.hand.append(placeholder)
|
||||
for cid in pd.get("shop", []):
|
||||
p.shop.append(Cards.by_id(cid) if str(cid) != "" else null)
|
||||
for cid in pd.get("offer", []):
|
||||
p.offer.append(Cards.by_id(cid))
|
||||
p.picks_left = int(pd.get("picks_left", 0))
|
||||
for cd in pd.board:
|
||||
var card := card_of(cd.card)
|
||||
var c := Game.Creature.new(card, p, int(cd.uid))
|
||||
c.attack = int(cd.attack)
|
||||
c.resonance = int(cd.resonance)
|
||||
c.field_bonus = int(cd.get("field_bonus", 0))
|
||||
c.health = int(cd.health)
|
||||
c.max_health = int(cd.max_health)
|
||||
c.shield = bool(cd.shield)
|
||||
c.frozen = bool(cd.frozen)
|
||||
c.ready = bool(cd.ready)
|
||||
c.attacks_left = int(cd.attacks_left)
|
||||
c.hidden = bool(cd.get("hidden", false))
|
||||
c.aura = int(cd.get("aura", 0))
|
||||
p.board.append(c)
|
||||
list.append(p)
|
||||
var hi := int(d.human)
|
||||
@@ -87,9 +87,8 @@ static func from_snapshot(d: Dictionary) -> Game:
|
||||
g.winner = d.winner
|
||||
g.winner_player = list[int(d.winner_player)] if int(d.winner_player) >= 0 else null
|
||||
g.next_uid = int(d.next_uid)
|
||||
g.field_element = str(d.get("field_element", ""))
|
||||
for e in Cards.ELEMENTS:
|
||||
g.field_charge[e] = int(d.get("field_charge", {}).get(e, 0))
|
||||
for i in int(d.get("deck_size", 0)):
|
||||
g.deck.append(placeholder) # nur die Größe zählt; gezogen wird beim Host
|
||||
for line in d.log:
|
||||
g.log.append(str(line))
|
||||
for ev in d.events:
|
||||
|
||||
Reference in New Issue
Block a user