Skip to content

Commit

Permalink
(station) west square objects & bus stops, part IV (#75)
Browse files Browse the repository at this point in the history
  • Loading branch information
ahyangyi authored Feb 19, 2025
1 parent fa0c7d5 commit ee9ad0a
Show file tree
Hide file tree
Showing 19 changed files with 318 additions and 231 deletions.
3 changes: 2 additions & 1 deletion station/lang/chinese.lng
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,8 @@ STR_STATION_CLASS_E7B981W :{PUSH_COLOUR}{WHITE}CNS:{POP_COLOUR}繁昌西
STR_STATION_CLASS_E88A9CP :{PUSH_COLOUR}{WHITE}CNS:{POP_COLOUR}芜湖包 - 站台

STR_OBJECT_CLASS_E88A9CB0 :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 芜湖站 - 站房
STR_OBJECT_CLASS_E88A9CG :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 芜湖站 - 西广场 - 地面
STR_OBJECT_CLASS_E88A9CG :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 芜湖站 - 西广场 - 地面 (斜坡)
STR_OBJECT_CLASS_E88A9Cg :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 芜湖站 - 西广场 - 地面 (无斜坡)
STR_OBJECT_CLASS_E88A9CF :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 芜湖站 - 西广场 - 绿雕
STR_OBJECT_CLASS_E88A9Cl :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 芜湖站 - 西广场 - 草坪
STR_OBJECT_CLASS_E88A9CL :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 芜湖站 - 西广场 - 路灯
Expand Down
3 changes: 2 additions & 1 deletion station/lang/english-uk.lng
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,8 @@ STR_STATION_CLASS_E7B981W :{PUSH_COLOUR}{WHITE}CNS:{POP_COLOUR} Fanchang W
STR_STATION_CLASS_E88A9CP :{PUSH_COLOUR}{WHITE}CNS:{POP_COLOUR} Wuhu - Extra Platforms

STR_OBJECT_CLASS_E88A9CB0 :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} Station Building
STR_OBJECT_CLASS_E88A9CG :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} West Square - Ground
STR_OBJECT_CLASS_E88A9CG :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} West Square - Ground (w/ slopes)
STR_OBJECT_CLASS_E88A9Cg :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} West Square - Ground (w/o slopes)
STR_OBJECT_CLASS_E88A9CF :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} West Square - Topiary
STR_OBJECT_CLASS_E88A9Cl :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} West Square - Lawn
STR_OBJECT_CLASS_E88A9CL :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} West Square - Light Post
Expand Down
3 changes: 2 additions & 1 deletion station/lang/traditional_chinese.lng
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,8 @@ STR_STATION_CLASS_E7B981W :{PUSH_COLOUR}{WHITE}CNS:{POP_COLOUR}繁昌西
STR_STATION_CLASS_E88A9CP :{PUSH_COLOUR}{WHITE}CNS:{POP_COLOUR}蕪湖包 - 月台

STR_OBJECT_CLASS_E88A9CB0 :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 蕪湖站 - 站房
STR_OBJECT_CLASS_E88A9CG :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 蕪湖站 - 西廣場 - 地面
STR_OBJECT_CLASS_E88A9CG :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 蕪湖站 - 西廣場 - 地面 (斜坡)
STR_OBJECT_CLASS_E88A9Cg :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 蕪湖站 - 西廣場 - 地面 (無斜坡)
STR_OBJECT_CLASS_E88A9CF :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 蕪湖站 - 西廣場 - 綠雕
STR_OBJECT_CLASS_E88A9Cl :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 蕪湖站 - 西廣場 - 草坪
STR_OBJECT_CLASS_E88A9CL :{PUSH_COLOUR}{WHITE}|>{POP_COLOUR} 蕪湖站 - 西廣場 - 路燈
Expand Down
4 changes: 3 additions & 1 deletion station/stations/dovemere_2018_lib/demos/plaza/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from .west_plaza import west_plaza
from .west_plaza_vast import west_plaza_vast
from .west_plaza_default import west_plaza_default

plaza_demos = [west_plaza]
plaza_demos = [west_plaza, west_plaza_vast, west_plaza_default]
7 changes: 5 additions & 2 deletions station/stations/dovemere_2018_lib/demos/plaza/west_plaza.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@
from station.stations.dovemere_2018_lib.roadstops import named_layouts as roadstop_layouts
from station.stations.dovemere_2018_lib.objects import named_layouts as object_layouts
from station.stations.dovemere_2018_lib.layouts import globalize_all
from station.stations.misc import default
from station.stations.misc import slope_2
from ..utils import h_merge

globalize_all(platform_class="concrete", shelter_class="shelter_2")
roadstop_layouts.globalize()
object_layouts.globalize()

station = h_merge([[[]] * 2, semitraversable.demo_1(5, 7)[5:], [[]] * 2], [[cns], [default]])
station = h_merge(
[[[cns], [slope_2.lower_tile()]], semitraversable.demo_1(5, 7)[5:], [[cns], [slope_2.lower_tile()]]], [[], []]
)

# Road Stops
overpass = overpass.lower_tile()
Expand All @@ -22,6 +24,7 @@
center_ground = west_plaza_center.lower_tile()
west_square = [[center_ground] * 7] * 2


west_plaza = Demo(
station + roadstops + west_square, "West plaza", remap=get_1cc_remap(CompanyColour.WHITE), merge_bbox=True
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from station.lib import Demo
from station.lib.utils import get_1cc_remap
from agrf.graphics.palette import CompanyColour
from station.stations.dovemere_2018_lib.flexible_stations import semitraversable
from station.stations.dovemere_2018_lib.roadstops import named_layouts as roadstop_layouts
from station.stations.dovemere_2018_lib.objects import named_layouts as object_layouts
from station.stations.dovemere_2018_lib.layouts import globalize_all
from station.stations.misc import slope_2, building_ground_layout
from ..utils import h_merge

globalize_all(platform_class="concrete", shelter_class="shelter_2")
roadstop_layouts.globalize()
object_layouts.globalize()

station = h_merge(
[[[cns], [slope_2.lower_tile()]], semitraversable.demo_1(5, 7)[5:], [[cns], [slope_2.lower_tile()]]], [[], []]
)

# Road Stops
overpass = overpass.lower_tile()
roadstops = [[None] + [overpass] * 5 + [None]]

# Objects
building_ground_layout = building_ground_layout.lower_tile()
west_square = [[building_ground_layout] * 7, [building_ground_layout] * 7]


west_plaza_default = Demo(
station + roadstops + west_square,
"West plaza (vanilla ground)",
remap=get_1cc_remap(CompanyColour.YELLOW),
merge_bbox=True,
)
45 changes: 45 additions & 0 deletions station/stations/dovemere_2018_lib/demos/plaza/west_plaza_vast.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from station.lib import Demo, AGroundSprite, ALayout
from station.lib.utils import get_1cc_remap
from agrf.graphics.palette import CompanyColour
from agrf.lib.building.image_sprite import image_sprite
from station.stations.dovemere_2018_lib.flexible_stations import semitraversable
from station.stations.dovemere_2018_lib.roadstops import named_layouts as roadstop_layouts
from station.stations.dovemere_2018_lib.objects import named_layouts as object_layouts
from station.stations.dovemere_2018_lib.layouts import globalize_all
from station.stations.misc import slope_2
from ..utils import h_merge

globalize_all(platform_class="concrete", shelter_class="shelter_2")
roadstop_layouts.globalize()
object_layouts.globalize()

station = h_merge(
[[[cns], [slope_2.lower_tile()]], semitraversable.demo_1(5, 7)[5:], [[cns], [slope_2.lower_tile()]]], [[], []]
)

# Road Stops
overpass = overpass.lower_tile()
roadstops = [[None] + [overpass] * 5 + [None]]


# Objects
def vast(x):
return ALayout(AGroundSprite(image_sprite(f"third_party/vast/vast_{x}.png")), [], True)


ground = vast(26).lower_tile()
symbol = vast(47).lower_tile()
grassy = vast(70).lower_tile()
west_square = [
[ground, grassy, ground, ground, ground, grassy, ground],
[grassy, grassy, ground, symbol, ground, grassy, grassy],
[grassy, ground, ground, ground, ground, ground, grassy],
]


west_plaza_vast = Demo(
station + roadstops + west_square,
"West plaza (with VAST Objects tiles)",
remap=get_1cc_remap(CompanyColour.MAUVE),
merge_bbox=True,
)
2 changes: 0 additions & 2 deletions station/stations/dovemere_2018_lib/demos/realistic/normal.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
from station.lib.utils import get_1cc_remap
from agrf.graphics.palette import CompanyColour
from station.stations.dovemere_2018_lib.flexible_stations import semitraversable
from station.stations.dovemere_2018_lib.roadstops import roadstops
from station.stations.dovemere_2018_lib.objects import objects

normal_demo = Demo(
semitraversable.demo_1(5, 7), "5×7 station layout (1 tile ≈ 40m)", remap=get_1cc_remap(CompanyColour.WHITE)
Expand Down
12 changes: 7 additions & 5 deletions station/stations/dovemere_2018_lib/objects_utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
objects = []


def register_slopes(slopes, sym, flags=DEFAULT_SLOPE_FLAGS):
def register_slopes(slopes, sym, starting_id, flags=DEFAULT_SLOPE_FLAGS):
for chi_ind in sym.chirality_indices():
layouts = []
purchase_layouts = []
Expand All @@ -42,7 +42,7 @@ def register_slopes(slopes, sym, flags=DEFAULT_SLOPE_FLAGS):
purchase_layouts.append(default)

cur_object = AObject(
id=len(objects),
id=starting_id,
translation_name="WEST_PLAZA",
layouts=layouts,
purchase_layouts=purchase_layouts,
Expand All @@ -57,10 +57,11 @@ def register_slopes(slopes, sym, flags=DEFAULT_SLOPE_FLAGS):
doc_layout=purchase_layouts[0],
callbacks={"tile_check": 0x400},
)
starting_id += 1
objects.append(cur_object)


def register(layouts, sym, label, flags=DEFAULT_FLAGS):
def register(layouts, sym, label, starting_id, flags=DEFAULT_FLAGS, allow_flip=True):
rows = len(layouts)
columns = len(layouts[0])
layout = PositionSwitch(
Expand All @@ -70,14 +71,14 @@ def register(layouts, sym, label, flags=DEFAULT_FLAGS):
rows=rows,
columns=columns,
)
for cur in sym.chiralities(layout):
for cur in sym.chiralities(layout)[: 2 if allow_flip else 1]:
demo = Demo(cur.to_lists())
doc_layout = demo.to_layout()
doc_layout.category = b"\xe8\x8a\x9cZ" # FIXME doc category?
layouts = sym.rotational_views(cur)
num_views = len(layouts)
cur_object = AObject(
id=len(objects),
id=starting_id,
translation_name="WEST_PLAZA",
layouts=layouts,
purchase_layouts=sym.rotational_views(doc_layout),
Expand All @@ -92,4 +93,5 @@ def register(layouts, sym, label, flags=DEFAULT_FLAGS):
doc_layout=doc_layout,
callbacks={"tile_check": 0x400},
)
starting_id += 1
objects.append(cur_object)
105 changes: 105 additions & 0 deletions station/stations/dovemere_2018_lib/roadstop_utils/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
from station.lib import (
BuildingFull,
BuildingSymmetricalX,
BuildingSymmetrical,
AParentSprite,
ALayout,
AChildSprite,
AttrDict,
Registers,
)
from station.lib.parameters import parameter_list
from agrf.graphics.voxel import LazyVoxel
from agrf.magic import Switch
from roadstop.lib import ARoadStop
from agrf.graphics.recolour import NON_RENDERABLE_COLOUR
from ...misc import road_ground

named_parts = AttrDict(schema=("name", "part"))
named_layouts = AttrDict(schema=("name",))

roadstops = []


def register_road_stop(layout, sym, starting_id):
assert 0x8000 <= starting_id < 0xC000
for i, cur in enumerate(sym.get_all_variants(layout)[::2]):
cur_roadstop = ARoadStop(
id=starting_id + i,
translation_name="WEST_PLAZA_BUS",
graphics=Switch(ranges={4: cur, 5: cur.M}, default=cur, code="view"),
general_flags=0x8,
class_label=b"\xe8\x8a\x9cR",
enable_if=[parameter_list["E88A9CA_ENABLE_ROADSTOP"]],
doc_layout=cur,
)
roadstops.append(cur_roadstop)
cur_roadstop = ARoadStop(
id=0x4000 + starting_id + i,
translation_name="WEST_PLAZA_BUS",
graphics=Switch(ranges={4: cur, 5: cur.M}, default=cur, code="view"),
general_flags=0x8,
class_label=b"\xe8\x8a\x9cR",
enable_if=[parameter_list["E88A9CA_ENABLE_ROADSTOP"]],
doc_layout=cur,
is_waypoint=True,
)
roadstops.append(cur_roadstop)


def make_road_stop(name, sym, starting_id, far, overpass, near, extended, floating, joggle=0):
v = LazyVoxel(
name,
prefix=".cache/render/station/dovemere_2018/west_plaza/road_stop",
voxel_getter=lambda path=f"station/voxels/dovemere_2018/west_plaza/road_stop/{name}.vox": path,
load_from="station/files/cns-gorender.json",
)
# For better handling of pillars/bollards
v.config["tiling_mode"] = "reflect"
v.config["joggle"] = joggle
if extended:
v.config["size"]["x"] = 448
v.config["size"]["y"] = 448
for sprite in v.config["sprites"]:
sprite["width"] = 112
v.config["agrf_zdiff"] = -12

snow = v.keep_layers(("snow",), "snow")
snow = snow.compose(v, "merge", ignore_mask=True, colour_map=NON_RENDERABLE_COLOUR)
snow.config["agrf_childsprite"] = (0, -3)

nosnow = v.discard_layers(("snow",), "nosnow")
nosnow.config["agrf_manual_crop"] = (0, 3)

extended_suffix = "_extended" if extended else ""

ps = []
for part, partname in ((far, "far"), (overpass, "overpass"), (near, "near")):
if part is None:
continue
span, offset = part

def make_part(v):
partv = v.mask_clip_away(
f"station/voxels/dovemere_2018/masks/road_{partname}_mask{extended_suffix}.vox", partname
)
partv.in_place_subset(sym.render_indices())
partsprite = sym.create_variants(
partv.spritesheet(
xspan=span[1], yspan=span[0], xdiff=offset[1], ydiff=offset[0], zdiff=offset[2] + floating
)
)
return partsprite

partps = AParentSprite(make_part(nosnow), span, offset)
partsnow = make_part(snow)
partsnow.voxel.render()
snowcs = AChildSprite(partsnow, (0, 0), flags={"dodraw": Registers.SNOW})
partps = partps + snowcs
named_parts[(name, partname)] = partps
ps.append(partps)

layout = ALayout(road_ground, ps, True, category=b"\xe8\x8a\x9cR")
named_layouts[(name,)] = layout

register_road_stop(layout, sym, starting_id)
Loading

0 comments on commit ee9ad0a

Please sign in to comment.