Browse Source

Add killable objects (ships, etc.) to universe data.

master
Ben Kurtovic 7 years ago
parent
commit
cffb98229c
3 changed files with 131 additions and 22 deletions
  1. +58
    -4
      calefaction/eve/universe.py
  2. +71
    -17
      scripts/import_sde.py
  3. +2
    -1
      templates/campaigns/renderers.mako

+ 58
- 4
calefaction/eve/universe.py View File

@@ -113,6 +113,39 @@ class _Faction(_UniqueObject):
return self._data["name"] return self._data["name"]




class _Killable(_UniqueObject):
"""Represents a killable object, like a ship, structure, or fighter."""

def __init__(self, universe, kid, cat, data):
super().__init__(universe, kid, data)
self._cat = cat

@property
def name(self):
"""The killable object's name, as a string."""
return self._data["name"]

@property
def group(self):
"""The killable object's group, as a string."""
return self._data["group"]

@property
def is_ship(self):
"""Whether the killable object is a ship."""
return self._cat == "ships"

@property
def is_structure(self):
"""Whether the killable object is a structure."""
return self._cat == "structures"

@property
def is_fighter(self):
"""Whether the killable object is a fighter."""
return self._cat == "fighters"


class _DummySolarSystem(_SolarSystem): class _DummySolarSystem(_SolarSystem):
"""Represents an unknown or invalid solar system.""" """Represents an unknown or invalid solar system."""


@@ -153,6 +186,16 @@ class _DummyFaction(_Faction):
}) })




class _DummyKillable(_Killable):
"""Represents an unknown or invalid killable object."""

def __init__(self, universe):
super().__init__(universe, -1, None, {
"name": "Unknown",
"group": "Unknown"
})


class Universe: class Universe:
"""EVE API module for static universe data.""" """EVE API module for static universe data."""


@@ -166,6 +209,8 @@ class Universe:
self._constellations = {} self._constellations = {}
self._regions = {} self._regions = {}
self._factions = {} self._factions = {}
self._killable_idx = {}
self._killable_tab = {}


@staticmethod @staticmethod
def _load_yaml(path): def _load_yaml(path):
@@ -192,6 +237,12 @@ class Universe:
self._factions = entities["factions"] self._factions = entities["factions"]
del entities del entities


types = self._load_yaml(self._dir / "types.yml.gz")
self._killable_idx = {kid: cat for cat, kids in types.items()
for kid in kids}
self._killable_tab = types
del types

self._loaded = True self._loaded = True


def system(self, sid): def system(self, sid):
@@ -234,10 +285,13 @@ class Universe:
return _DummyFaction(self) return _DummyFaction(self)
return _Faction(self, fid, self._factions[fid]) return _Faction(self, fid, self._factions[fid])


def ship(self, sid):
"""Return a _Ship with the given ID.
def killable(self, kid):
"""Return a _Killable with the given ID.


If the ID is invalid, return a dummy unknown object with ID -1. If the ID is invalid, return a dummy unknown object with ID -1.
""" """
...
raise NotImplementedError()
self._load()
if kid not in self._killable_idx:
return _DummyKillable(self)
cat = self._killable_idx[kid]
return _Killable(self, kid, cat, self._killable_tab[cat][kid])

+ 71
- 17
scripts/import_sde.py View File

@@ -8,6 +8,10 @@ import sys


import yaml import yaml


_SHIP_CAT = 6
_FIGHTER_CAT = 87
_STRUCT_CATS = [22, 23, 40, 46, 65]

_REGION = 3 _REGION = 3
_CONSTELLATION = 4 _CONSTELLATION = 4
_SOLAR_SYSTEM = 5 _SOLAR_SYSTEM = 5
@@ -16,12 +20,40 @@ def _load_yaml(filename):
with filename.open("rb") as fp: with filename.open("rb") as fp:
return yaml.load(fp, Loader=yaml.CLoader) return yaml.load(fp, Loader=yaml.CLoader)


def _verify_typeids(sde_dir):
print("Verifying typeIDs... ", end="", flush=True)
def _save_yaml(filename, data):
with filename.open("w") as fp:
fp.write(yaml.dump(data, Dumper=yaml.CDumper))


filename = sde_dir / "fsd" / "typeIDs.yaml"
with filename.open("rb") as fp:
data = yaml.load(fp.read(1024 * 16), Loader=yaml.CLoader)
def _verify_categoryids(sde_dir):
print("Verifying categoryIDs... ", end="", flush=True)

data = _load_yaml(sde_dir / "fsd" / "categoryIDs.yaml")

assert data[_SHIP_CAT]["name"]["en"] == "Ship"

print("done.")

def _load_groupids(sde_dir):
print("Loading groupIDs... ", end="", flush=True)

data = _load_yaml(sde_dir / "fsd" / "groupIDs.yaml")

groups = {cid: {} for cid in [_SHIP_CAT, _FIGHTER_CAT] + _STRUCT_CATS}
for gid, group in data.items():
cat = group["categoryID"]
if cat in groups:
name = group["name"]["en"]
assert isinstance(gid, int)
assert isinstance(name, str)
groups[cat][gid] = name

print("done.")
return groups

def _load_typeids(sde_dir, groups):
print("Loading typeIDs... ", end="", flush=True)

data = _load_yaml(sde_dir / "fsd" / "typeIDs.yaml")


assert data[_REGION]["groupID"] == _REGION assert data[_REGION]["groupID"] == _REGION
assert data[_REGION]["name"]["en"] == "Region" assert data[_REGION]["name"]["en"] == "Region"
@@ -30,7 +62,23 @@ def _verify_typeids(sde_dir):
assert data[_SOLAR_SYSTEM]["groupID"] == _SOLAR_SYSTEM assert data[_SOLAR_SYSTEM]["groupID"] == _SOLAR_SYSTEM
assert data[_SOLAR_SYSTEM]["name"]["en"] == "Solar System" assert data[_SOLAR_SYSTEM]["name"]["en"] == "Solar System"


types = {"ships": {}, "structures": {}, "fighters": {}}
cat_conv = {_SHIP_CAT: "ships", _FIGHTER_CAT: "fighters"}
cat_conv.update({cid: "structures" for cid in _STRUCT_CATS})
group_conv = {gid: cid for cid, gids in groups.items() for gid in gids}

for tid, type_ in data.items():
gid = type_["groupID"]
if gid in group_conv:
cid = group_conv[gid]
cname = cat_conv[cid]
name = type_["name"]["en"]
group = groups[cid][gid]
assert isinstance(tid, int)
types[cname][tid] = {"name": name, "group": group}

print("done.") print("done.")
return types


def _load_ids(sde_dir): def _load_ids(sde_dir):
print("Loading itemIDs... ", end="", flush=True) print("Loading itemIDs... ", end="", flush=True)
@@ -194,12 +242,17 @@ def _load_factions(sde_dir):
print("done.") print("done.")
return factions return factions


def _dump_types(out_dir, types):
print("Dumping types... ", end="", flush=True)

_save_yaml(out_dir / "types.yml", types)

print("done.")

def _dump_galaxy(out_dir, galaxy): def _dump_galaxy(out_dir, galaxy):
print("Dumping galaxy... ", end="", flush=True) print("Dumping galaxy... ", end="", flush=True)


filename = out_dir / "galaxy.yml"
with filename.open("w") as fp:
fp.write(yaml.dump(galaxy, Dumper=yaml.CDumper))
_save_yaml(out_dir / "galaxy.yml", galaxy)


print("done.") print("done.")


@@ -207,15 +260,12 @@ def _dump_entities(out_dir, factions):
print("Dumping entities... ", end="", flush=True) print("Dumping entities... ", end="", flush=True)


entities = {"factions": factions} entities = {"factions": factions}

filename = out_dir / "entities.yml"
with filename.open("w") as fp:
fp.write(yaml.dump(entities, Dumper=yaml.CDumper))
_save_yaml(out_dir / "entities.yml", entities)


print("done.") print("done.")


def _compress(out_dir): def _compress(out_dir):
targets = ["galaxy", "entities"]
targets = ["types", "galaxy", "entities"]
for basename in targets: for basename in targets:
print("Compressing %s... " % basename, end="", flush=True) print("Compressing %s... " % basename, end="", flush=True)


@@ -231,7 +281,7 @@ def _compress(out_dir):
def _cleanup(out_dir): def _cleanup(out_dir):
print("Cleaning up... ", end="", flush=True) print("Cleaning up... ", end="", flush=True)


targets = ["galaxy", "entities"]
targets = ["types", "galaxy", "entities"]
for basename in targets: for basename in targets:
(out_dir / (basename + ".yml")).unlink() (out_dir / (basename + ".yml")).unlink()


@@ -243,15 +293,19 @@ def import_sde(sde_dir, out_dir):
print("- from: %s" % sde_dir) print("- from: %s" % sde_dir)
print("- to: %s" % out_dir) print("- to: %s" % out_dir)


_verify_typeids(sde_dir)
_verify_categoryids(sde_dir)
groups = _load_groupids(sde_dir)
types = _load_typeids(sde_dir, groups)
_dump_types(out_dir, types)
del groups, types

ids = _load_ids(sde_dir) ids = _load_ids(sde_dir)
print("Counts: regions=%d, constellations=%d, systems=%d" % ( print("Counts: regions=%d, constellations=%d, systems=%d" % (
len(ids[_REGION]), len(ids[_CONSTELLATION]), len(ids[_SOLAR_SYSTEM]))) len(ids[_REGION]), len(ids[_CONSTELLATION]), len(ids[_SOLAR_SYSTEM])))
names = _load_names(sde_dir) names = _load_names(sde_dir)


galaxy = _build_galaxy_skeleton(ids, names) galaxy = _build_galaxy_skeleton(ids, names)
del ids
del names
del ids, names
_load_galaxy_associations(sde_dir, galaxy) _load_galaxy_associations(sde_dir, galaxy)
_dump_galaxy(out_dir, galaxy) _dump_galaxy(out_dir, galaxy)
del galaxy del galaxy


+ 2
- 1
templates/campaigns/renderers.mako View File

@@ -7,6 +7,7 @@
<% <%
victim = kill["victim"] victim = kill["victim"]
system = g.eve.universe.system(kill["system"]) system = g.eve.universe.system(kill["system"])
killed = g.eve.universe.killable(victim["ship_id"])
%> %>
<tr> <tr>
<td class="fluid"> <td class="fluid">
@@ -21,7 +22,7 @@
</td> </td>
<td class="icon"> <td class="icon">
<a href="https://zkillboard.com/kill/${kill['id']}/"> <a href="https://zkillboard.com/kill/${kill['id']}/">
<img title="Kill ${kill['id']}: ..." alt="Kill ${kill['id']}: ..." src="${g.eve.image.inventory(victim["ship_id"], 64)}"/>
<img title="Kill ${kill['id']}: ${killed.name}" alt="Kill ${kill['id']}: ${killed.name}" src="${g.eve.image.inventory(victim["ship_id"], 64)}"/>
</a> </a>
</td> </td>
<td class="icon extra"> <td class="icon extra">


Loading…
Cancel
Save