Skip to content

Commit 2a03132

Browse files
committed
convert: Refactor SWGBCCNyanSubprocessor into separate files.
1 parent e927a93 commit 2a03132

File tree

10 files changed

+931
-801
lines changed

10 files changed

+931
-801
lines changed

openage/convert/processor/conversion/swgbcc/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ add_py_modules(
1515
add_subdirectory(ability)
1616
add_subdirectory(auxiliary)
1717
add_subdirectory(civ)
18+
add_subdirectory(nyan)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
add_py_modules(
2+
__init__.py
3+
ambient.py
4+
building.py
5+
civ.py
6+
projectile.py
7+
tech.py
8+
unit.py
9+
)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Copyright 2025-2025 the openage authors. See copying.md for legal info.
2+
3+
"""
4+
Convert API-like objects to nyan objects. Subroutine of the
5+
main SWGBCC processor.
6+
"""
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# Copyright 2025-2025 the openage authors. See copying.md for legal info.
2+
3+
"""
4+
Convert ambient groups to openage game entities.
5+
"""
6+
from __future__ import annotations
7+
import typing
8+
9+
from .....entity_object.conversion.converter_object import RawAPIObject
10+
from .....service.conversion import internal_name_lookups
11+
from ...aoc.ability_subprocessor import AoCAbilitySubprocessor
12+
from ..ability_subprocessor import SWGBCCAbilitySubprocessor
13+
14+
if typing.TYPE_CHECKING:
15+
from .....entity_object.conversion.aoc.genie_unit import GenieAmbientGroup
16+
17+
18+
def ambient_group_to_game_entity(ambient_group: GenieAmbientGroup) -> None:
19+
"""
20+
Creates raw API objects for an ambient group.
21+
22+
:param ambient_group: Unit line that gets converted to a game entity.
23+
"""
24+
ambient_unit = ambient_group.get_head_unit()
25+
ambient_id = ambient_group.get_head_unit_id()
26+
27+
dataset = ambient_group.data
28+
29+
name_lookup_dict = internal_name_lookups.get_entity_lookups(dataset.game_version)
30+
class_lookup_dict = internal_name_lookups.get_class_lookups(dataset.game_version)
31+
32+
# Start with the generic GameEntity
33+
game_entity_name = name_lookup_dict[ambient_id][0]
34+
obj_location = f"data/game_entity/generic/{name_lookup_dict[ambient_id][1]}/"
35+
raw_api_object = RawAPIObject(game_entity_name, game_entity_name,
36+
dataset.nyan_api_objects)
37+
raw_api_object.add_raw_parent("engine.util.game_entity.GameEntity")
38+
raw_api_object.set_location(obj_location)
39+
raw_api_object.set_filename(name_lookup_dict[ambient_id][1])
40+
ambient_group.add_raw_api_object(raw_api_object)
41+
42+
# =======================================================================
43+
# Game Entity Types
44+
# =======================================================================
45+
# we give an ambient the types
46+
# - util.game_entity_type.types.Ambient
47+
# =======================================================================
48+
# Create or use existing auxiliary types
49+
types_set = []
50+
51+
type_obj = dataset.pregen_nyan_objects["util.game_entity_type.types.Ambient"].get_nyan_object(
52+
)
53+
types_set.append(type_obj)
54+
55+
unit_class = ambient_unit["unit_class"].value
56+
class_name = class_lookup_dict[unit_class]
57+
class_obj_name = f"util.game_entity_type.types.{class_name}"
58+
type_obj = dataset.pregen_nyan_objects[class_obj_name].get_nyan_object()
59+
types_set.append(type_obj)
60+
61+
raw_api_object.add_raw_member("types", types_set, "engine.util.game_entity.GameEntity")
62+
63+
# =======================================================================
64+
# Abilities
65+
# =======================================================================
66+
abilities_set = []
67+
68+
interaction_mode = ambient_unit["interaction_mode"].value
69+
70+
if interaction_mode >= 0:
71+
abilities_set.append(AoCAbilitySubprocessor.death_ability(ambient_group))
72+
abilities_set.append(AoCAbilitySubprocessor.collision_ability(ambient_group))
73+
abilities_set.append(AoCAbilitySubprocessor.idle_ability(ambient_group))
74+
abilities_set.append(AoCAbilitySubprocessor.live_ability(ambient_group))
75+
abilities_set.append(AoCAbilitySubprocessor.named_ability(ambient_group))
76+
abilities_set.append(AoCAbilitySubprocessor.resistance_ability(ambient_group))
77+
abilities_set.append(AoCAbilitySubprocessor.terrain_requirement_ability(ambient_group))
78+
abilities_set.append(AoCAbilitySubprocessor.visibility_ability(ambient_group))
79+
80+
if interaction_mode >= 2:
81+
abilities_set.extend(AoCAbilitySubprocessor.selectable_ability(ambient_group))
82+
83+
if not ambient_group.is_passable():
84+
abilities_set.append(AoCAbilitySubprocessor.pathable_ability(ambient_group))
85+
86+
if ambient_group.is_harvestable():
87+
abilities_set.append(SWGBCCAbilitySubprocessor.harvestable_ability(ambient_group))
88+
89+
# =======================================================================
90+
# Abilities
91+
# =======================================================================
92+
raw_api_object.add_raw_member("abilities", abilities_set,
93+
"engine.util.game_entity.GameEntity")
94+
95+
# =======================================================================
96+
# Modifiers
97+
# =======================================================================
98+
modifiers_set = []
99+
100+
raw_api_object.add_raw_member("modifiers", modifiers_set,
101+
"engine.util.game_entity.GameEntity")
102+
103+
# =======================================================================
104+
# TODO: Variants
105+
# =======================================================================
106+
variants_set = []
107+
108+
raw_api_object.add_raw_member("variants", variants_set,
109+
"engine.util.game_entity.GameEntity")
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
# Copyright 2025-2025 the openage authors. See copying.md for legal info.
2+
3+
"""
4+
Convert building lines to openage game entities.
5+
"""
6+
from __future__ import annotations
7+
import typing
8+
9+
from .....entity_object.conversion.aoc.genie_unit import GenieGarrisonMode
10+
from .....entity_object.conversion.converter_object import RawAPIObject
11+
from .....service.conversion import internal_name_lookups
12+
from ...aoc.ability_subprocessor import AoCAbilitySubprocessor
13+
from ..ability_subprocessor import SWGBCCAbilitySubprocessor
14+
from ..auxiliary_subprocessor import SWGBCCAuxiliarySubprocessor
15+
from .projectile import projectiles_from_line
16+
17+
if typing.TYPE_CHECKING:
18+
from .....entity_object.conversion.aoc.genie_unit import GenieBuildingLineGroup
19+
20+
21+
def building_line_to_game_entity(building_line: GenieBuildingLineGroup) -> None:
22+
"""
23+
Creates raw API objects for a building line.
24+
25+
:param building_line: Building line that gets converted to a game entity.
26+
"""
27+
current_building = building_line.line[0]
28+
current_building_id = building_line.get_head_unit_id()
29+
dataset = building_line.data
30+
31+
name_lookup_dict = internal_name_lookups.get_entity_lookups(dataset.game_version)
32+
class_lookup_dict = internal_name_lookups.get_class_lookups(dataset.game_version)
33+
34+
# Start with the generic GameEntity
35+
game_entity_name = name_lookup_dict[current_building_id][0]
36+
obj_location = f"data/game_entity/generic/{name_lookup_dict[current_building_id][1]}/"
37+
raw_api_object = RawAPIObject(game_entity_name, game_entity_name,
38+
dataset.nyan_api_objects)
39+
raw_api_object.add_raw_parent("engine.util.game_entity.GameEntity")
40+
raw_api_object.set_location(obj_location)
41+
raw_api_object.set_filename(name_lookup_dict[current_building_id][1])
42+
building_line.add_raw_api_object(raw_api_object)
43+
44+
# =======================================================================
45+
# Game Entity Types
46+
# =======================================================================
47+
# we give a building two types
48+
# - util.game_entity_type.types.Building (if unit_type >= 80)
49+
# - util.game_entity_type.types.<Class> (depending on the class)
50+
# and additionally
51+
# - util.game_entity_type.types.DropSite (only if this is used as a drop site)
52+
# =======================================================================
53+
# Create or use existing auxiliary types
54+
types_set = []
55+
unit_type = current_building["unit_type"].value
56+
57+
if unit_type >= 80:
58+
type_obj = dataset.pregen_nyan_objects[
59+
"util.game_entity_type.types.Building"
60+
].get_nyan_object()
61+
types_set.append(type_obj)
62+
63+
unit_class = current_building["unit_class"].value
64+
class_name = class_lookup_dict[unit_class]
65+
class_obj_name = f"util.game_entity_type.types.{class_name}"
66+
type_obj = dataset.pregen_nyan_objects[class_obj_name].get_nyan_object()
67+
types_set.append(type_obj)
68+
69+
if building_line.is_dropsite():
70+
type_obj = dataset.pregen_nyan_objects[
71+
"util.game_entity_type.types.DropSite"
72+
].get_nyan_object()
73+
types_set.append(type_obj)
74+
75+
raw_api_object.add_raw_member("types", types_set, "engine.util.game_entity.GameEntity")
76+
77+
# =======================================================================
78+
# Abilities
79+
# =======================================================================
80+
abilities_set = []
81+
82+
abilities_set.append(
83+
SWGBCCAbilitySubprocessor.attribute_change_tracker_ability(building_line))
84+
abilities_set.append(SWGBCCAbilitySubprocessor.death_ability(building_line))
85+
abilities_set.append(AoCAbilitySubprocessor.delete_ability(building_line))
86+
abilities_set.append(AoCAbilitySubprocessor.despawn_ability(building_line))
87+
abilities_set.append(AoCAbilitySubprocessor.idle_ability(building_line))
88+
abilities_set.append(AoCAbilitySubprocessor.collision_ability(building_line))
89+
abilities_set.append(AoCAbilitySubprocessor.live_ability(building_line))
90+
abilities_set.append(AoCAbilitySubprocessor.los_ability(building_line))
91+
abilities_set.append(AoCAbilitySubprocessor.named_ability(building_line))
92+
abilities_set.append(AoCAbilitySubprocessor.resistance_ability(building_line))
93+
abilities_set.extend(AoCAbilitySubprocessor.selectable_ability(building_line))
94+
abilities_set.append(AoCAbilitySubprocessor.stop_ability(building_line))
95+
abilities_set.append(AoCAbilitySubprocessor.terrain_requirement_ability(building_line))
96+
abilities_set.append(AoCAbilitySubprocessor.visibility_ability(building_line))
97+
98+
# Config abilities
99+
# if building_line.is_creatable():
100+
# abilities_set.append(SWGBCCAbilitySubprocessor.constructable_ability(building_line))
101+
102+
if not building_line.is_passable():
103+
abilities_set.append(AoCAbilitySubprocessor.pathable_ability(building_line))
104+
105+
if building_line.has_foundation():
106+
if building_line.get_class_id() == 7:
107+
# Use OverlayTerrain for the farm terrain
108+
abilities_set.append(AoCAbilitySubprocessor.overlay_terrain_ability(building_line))
109+
abilities_set.append(AoCAbilitySubprocessor.foundation_ability(building_line,
110+
terrain_id=7))
111+
112+
else:
113+
abilities_set.append(AoCAbilitySubprocessor.foundation_ability(building_line))
114+
115+
# Creation/Research abilities
116+
if len(building_line.creates) > 0:
117+
abilities_set.append(AoCAbilitySubprocessor.create_ability(building_line))
118+
abilities_set.append(AoCAbilitySubprocessor.production_queue_ability(building_line))
119+
120+
if len(building_line.researches) > 0:
121+
abilities_set.append(AoCAbilitySubprocessor.research_ability(building_line))
122+
123+
# Effect abilities
124+
if building_line.is_projectile_shooter():
125+
abilities_set.append(AoCAbilitySubprocessor.shoot_projectile_ability(building_line, 7))
126+
abilities_set.append(AoCAbilitySubprocessor.game_entity_stance_ability(building_line))
127+
projectiles_from_line(building_line)
128+
129+
# Storage abilities
130+
if building_line.is_garrison():
131+
abilities_set.append(AoCAbilitySubprocessor.storage_ability(building_line))
132+
abilities_set.append(AoCAbilitySubprocessor.remove_storage_ability(building_line))
133+
134+
garrison_mode = building_line.get_garrison_mode()
135+
136+
if garrison_mode == GenieGarrisonMode.NATURAL:
137+
abilities_set.append(
138+
SWGBCCAbilitySubprocessor.send_back_to_task_ability(building_line))
139+
140+
if garrison_mode in (GenieGarrisonMode.NATURAL, GenieGarrisonMode.SELF_PRODUCED):
141+
abilities_set.append(AoCAbilitySubprocessor.rally_point_ability(building_line))
142+
143+
# Resource abilities
144+
if building_line.is_harvestable():
145+
abilities_set.append(AoCAbilitySubprocessor.harvestable_ability(building_line))
146+
147+
if building_line.is_dropsite():
148+
abilities_set.append(AoCAbilitySubprocessor.drop_site_ability(building_line))
149+
150+
ability = AoCAbilitySubprocessor.provide_contingent_ability(building_line)
151+
if ability:
152+
abilities_set.append(ability)
153+
154+
# Trade abilities
155+
if building_line.is_trade_post():
156+
abilities_set.append(SWGBCCAbilitySubprocessor.trade_post_ability(building_line))
157+
158+
if building_line.get_id() == 84:
159+
# Spaceport trading
160+
abilities_set.extend(
161+
SWGBCCAbilitySubprocessor.exchange_resources_ability(building_line))
162+
163+
raw_api_object.add_raw_member("abilities", abilities_set,
164+
"engine.util.game_entity.GameEntity")
165+
166+
# =======================================================================
167+
# Modifiers
168+
# =======================================================================
169+
raw_api_object.add_raw_member("modifiers", [], "engine.util.game_entity.GameEntity")
170+
171+
# =======================================================================
172+
# TODO: Variants
173+
# =======================================================================
174+
raw_api_object.add_raw_member("variants", [], "engine.util.game_entity.GameEntity")
175+
176+
# =======================================================================
177+
# Misc (Objects that are not used by the unit line itself, but use its values)
178+
# =======================================================================
179+
if building_line.is_creatable():
180+
SWGBCCAuxiliarySubprocessor.get_creatable_game_entity(building_line)

0 commit comments

Comments
 (0)