redef class GameEntity
- # Saves `event` in `self`.
- fun add_event(event: GameEvent) do event.save_in(self.key)
+ # Register a new game event for this entity.
+ fun add_event(event: GameEvent) do
+ event.owner = self
+ event.save
+ end
# List all events registered in this entity.
#
#
# To add events see `add_event`.
fun load_events: Array[GameEvent] do
- var key = key / "events"
+ var req = new JsonObject
+ req["game"] = game.key
+ req["owner"] = key
var res = new Array[GameEvent]
- if not game.store.has_collection(key) then return res
- var coll = game.store.list_collection(key)
- for id in coll do
- var name = id.to_s
- res.add load_event(name).as(not null)
+ for obj in game.db.collection("events").find_all(req) do
+ res.add new GameEvent.from_json(game, obj)
end
(new EventTimeComparator).sort(res)
return res
# Looks for the event save file in game data.
# Returns `null` if the event cannot be found.
fun load_event(id: String): nullable GameEvent do
- var key = key / "events" / id
- if not game.store.has_key(key) then return null
- var json = game.store.load_object(key)
- return new GameEvent.from_json(game, json)
+ var req = new JsonObject
+ req["game"] = game.key
+ req["owner"] = key
+ req["internal_id"] = id
+ var res = game.db.collection("events").find(req)
+ if res != null then return new GameEvent.from_json(game, res)
+ return null
end
end
class GameEvent
super GameEntity
- redef var key is lazy do return "events" / internal_id
+ redef var collection_name = "events"
redef var game
+ # Entity this event belongs to.
+ var owner: nullable GameEntity = null
+
# String used to dissociate events in the display.
var kind: String
# GameEvent uniq id used for storage.
var internal_id: String is noinit
+ redef var key = internal_id is lazy
+
# Date and time of the event.
var time: ISODate is noinit, writable
#
# Used to load events from json storage.
init from_json(game: Game, json: JsonObject) do
- self.game = game
- internal_id = json["internal_id"].to_s
- kind = json["kind"].to_s
- time = new ISODate.from_string(json["time"].to_s)
- data = json["data"].as(JsonObject)
+ init(game, json["kind"].as(String), json["data"].as(JsonObject))
+ internal_id = json["internal_id"].as(String)
+ time = new ISODate.from_string(json["time"].as(String))
end
- redef fun to_json do
+ redef fun to_json_object do
var json = new JsonObject
json["internal_id"] = internal_id.to_s
json["kind"] = kind
json["time"] = time.to_s
json["data"] = data
+ json["game"] = game.key
+ var owner = self.owner
+ if owner != null then json["owner"] = owner.key
return json
end
end