zombie-escape 1.10.0__py3-none-any.whl → 1.12.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- zombie_escape/__about__.py +1 -1
- zombie_escape/colors.py +14 -12
- zombie_escape/entities.py +13 -0
- zombie_escape/entities_constants.py +9 -3
- zombie_escape/gameplay/__init__.py +2 -0
- zombie_escape/gameplay/interactions.py +19 -0
- zombie_escape/gameplay/layout.py +22 -1
- zombie_escape/gameplay/movement.py +15 -1
- zombie_escape/gameplay/spawn.py +95 -4
- zombie_escape/gameplay/state.py +2 -0
- zombie_escape/gameplay_constants.py +8 -0
- zombie_escape/level_blueprints.py +54 -22
- zombie_escape/locales/ui.en.json +9 -1
- zombie_escape/locales/ui.ja.json +8 -0
- zombie_escape/models.py +6 -1
- zombie_escape/render.py +420 -69
- zombie_escape/render_assets.py +104 -52
- zombie_escape/render_constants.py +28 -12
- zombie_escape/screens/game_over.py +1 -1
- zombie_escape/screens/gameplay.py +27 -1
- zombie_escape/stage_constants.py +31 -14
- {zombie_escape-1.10.0.dist-info → zombie_escape-1.12.0.dist-info}/METADATA +5 -2
- zombie_escape-1.12.0.dist-info/RECORD +47 -0
- zombie_escape-1.10.0.dist-info/RECORD +0 -47
- {zombie_escape-1.10.0.dist-info → zombie_escape-1.12.0.dist-info}/WHEEL +0 -0
- {zombie_escape-1.10.0.dist-info → zombie_escape-1.12.0.dist-info}/entry_points.txt +0 -0
- {zombie_escape-1.10.0.dist-info → zombie_escape-1.12.0.dist-info}/licenses/LICENSE.txt +0 -0
zombie_escape/render_assets.py
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import math
|
|
6
|
+
from dataclasses import dataclass
|
|
6
7
|
|
|
7
8
|
import pygame
|
|
8
9
|
|
|
@@ -10,14 +11,14 @@ from .colors import (
|
|
|
10
11
|
BLACK,
|
|
11
12
|
BLUE,
|
|
12
13
|
DARK_RED,
|
|
14
|
+
ORANGE,
|
|
13
15
|
RED,
|
|
16
|
+
STEEL_BEAM_COLOR,
|
|
17
|
+
STEEL_BEAM_LINE_COLOR,
|
|
14
18
|
TRACKER_OUTLINE_COLOR,
|
|
15
19
|
WALL_FOLLOWER_OUTLINE_COLOR,
|
|
16
20
|
YELLOW,
|
|
17
21
|
EnvironmentPalette,
|
|
18
|
-
ORANGE,
|
|
19
|
-
STEEL_BEAM_COLOR,
|
|
20
|
-
STEEL_BEAM_LINE_COLOR,
|
|
21
22
|
get_environment_palette,
|
|
22
23
|
)
|
|
23
24
|
from .render_constants import (
|
|
@@ -43,6 +44,101 @@ def _draw_outlined_circle(
|
|
|
43
44
|
pygame.draw.circle(surface, outline_color, center, radius, width=outline_width)
|
|
44
45
|
|
|
45
46
|
|
|
47
|
+
@dataclass(frozen=True)
|
|
48
|
+
class PolygonSpec:
|
|
49
|
+
size: tuple[int, int]
|
|
50
|
+
polygons: list[list[tuple[int, int]]]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
FUEL_CAN_SPEC = PolygonSpec(
|
|
54
|
+
size=(13, 17),
|
|
55
|
+
polygons=[
|
|
56
|
+
[
|
|
57
|
+
(1, 1),
|
|
58
|
+
(7, 1),
|
|
59
|
+
(12, 6),
|
|
60
|
+
(12, 16),
|
|
61
|
+
(1, 16),
|
|
62
|
+
],
|
|
63
|
+
[
|
|
64
|
+
(10, 1),
|
|
65
|
+
(12, 3),
|
|
66
|
+
(9, 4),
|
|
67
|
+
(7, 3),
|
|
68
|
+
],
|
|
69
|
+
],
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
FLASHLIGHT_SPEC = PolygonSpec(
|
|
73
|
+
size=(12, 10),
|
|
74
|
+
polygons=[
|
|
75
|
+
[
|
|
76
|
+
(1, 2),
|
|
77
|
+
(8, 2),
|
|
78
|
+
(8, 7),
|
|
79
|
+
(1, 7),
|
|
80
|
+
],
|
|
81
|
+
[
|
|
82
|
+
(8, 1),
|
|
83
|
+
(11, 1),
|
|
84
|
+
(11, 8),
|
|
85
|
+
(8, 8),
|
|
86
|
+
],
|
|
87
|
+
],
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
SHOES_SPEC = PolygonSpec(
|
|
91
|
+
size=(14, 10),
|
|
92
|
+
polygons=[
|
|
93
|
+
[
|
|
94
|
+
(1, 1),
|
|
95
|
+
(7, 1),
|
|
96
|
+
(7, 4),
|
|
97
|
+
(13, 6),
|
|
98
|
+
(13, 9),
|
|
99
|
+
(1, 9),
|
|
100
|
+
],
|
|
101
|
+
],
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _scale_polygons(
|
|
106
|
+
spec: PolygonSpec,
|
|
107
|
+
dst_size: tuple[int, int],
|
|
108
|
+
) -> list[list[tuple[int, int]]]:
|
|
109
|
+
src_w, src_h = spec.size
|
|
110
|
+
dst_w, dst_h = dst_size
|
|
111
|
+
scale_x = dst_w / max(1, src_w)
|
|
112
|
+
scale_y = dst_h / max(1, src_h)
|
|
113
|
+
scaled = []
|
|
114
|
+
for poly in spec.polygons:
|
|
115
|
+
scaled.append(
|
|
116
|
+
[
|
|
117
|
+
(
|
|
118
|
+
int(round(x * scale_x)),
|
|
119
|
+
int(round(y * scale_y)),
|
|
120
|
+
)
|
|
121
|
+
for x, y in poly
|
|
122
|
+
]
|
|
123
|
+
)
|
|
124
|
+
return scaled
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _draw_polygon_surface(
|
|
128
|
+
width: int,
|
|
129
|
+
height: int,
|
|
130
|
+
spec: PolygonSpec,
|
|
131
|
+
) -> pygame.Surface:
|
|
132
|
+
surface = pygame.Surface((width, height), pygame.SRCALPHA)
|
|
133
|
+
draw_polygons = spec.polygons
|
|
134
|
+
if (width, height) != spec.size:
|
|
135
|
+
draw_polygons = _scale_polygons(spec, (width, height))
|
|
136
|
+
for poly in draw_polygons:
|
|
137
|
+
pygame.draw.polygon(surface, YELLOW, poly)
|
|
138
|
+
pygame.draw.polygon(surface, BLACK, poly, width=1)
|
|
139
|
+
return surface
|
|
140
|
+
|
|
141
|
+
|
|
46
142
|
def build_beveled_polygon(
|
|
47
143
|
width: int,
|
|
48
144
|
height: int,
|
|
@@ -464,60 +560,15 @@ def paint_zombie_surface(
|
|
|
464
560
|
|
|
465
561
|
|
|
466
562
|
def build_fuel_can_surface(width: int, height: int) -> pygame.Surface:
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
# Jerrycan silhouette with cut corner
|
|
470
|
-
body_pts = [
|
|
471
|
-
(1, 4),
|
|
472
|
-
(width - 2, 4),
|
|
473
|
-
(width - 2, height - 2),
|
|
474
|
-
(1, height - 2),
|
|
475
|
-
(1, 8),
|
|
476
|
-
(4, 4),
|
|
477
|
-
]
|
|
478
|
-
pygame.draw.polygon(surface, YELLOW, body_pts)
|
|
479
|
-
pygame.draw.polygon(surface, BLACK, body_pts, width=2)
|
|
480
|
-
|
|
481
|
-
cap_size = max(2, width // 4)
|
|
482
|
-
cap_rect = pygame.Rect(width - cap_size - 2, 1, cap_size, 3)
|
|
483
|
-
pygame.draw.rect(surface, YELLOW, cap_rect, border_radius=1)
|
|
484
|
-
pygame.draw.rect(surface, BLACK, cap_rect, width=1, border_radius=1)
|
|
485
|
-
|
|
486
|
-
# Cross brace accent
|
|
487
|
-
brace_color = (240, 200, 40)
|
|
488
|
-
pygame.draw.line(
|
|
489
|
-
surface, brace_color, (3, height // 2), (width - 4, height // 2), width=2
|
|
490
|
-
)
|
|
491
|
-
pygame.draw.line(
|
|
492
|
-
surface, BLACK, (3, height // 2), (width - 4, height // 2), width=1
|
|
493
|
-
)
|
|
494
|
-
return surface
|
|
563
|
+
return _draw_polygon_surface(width, height, FUEL_CAN_SPEC)
|
|
495
564
|
|
|
496
565
|
|
|
497
566
|
def build_flashlight_surface(width: int, height: int) -> pygame.Surface:
|
|
498
|
-
|
|
567
|
+
return _draw_polygon_surface(width, height, FLASHLIGHT_SPEC)
|
|
499
568
|
|
|
500
|
-
body_color = (230, 200, 70)
|
|
501
|
-
trim_color = (80, 70, 40)
|
|
502
|
-
head_color = (200, 180, 90)
|
|
503
|
-
beam_color = (255, 240, 180, 150)
|
|
504
569
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
body_rect.right - 3, body_rect.top - 1, 4, body_rect.height + 2
|
|
508
|
-
)
|
|
509
|
-
beam_points = [
|
|
510
|
-
(head_rect.right + 4, head_rect.centery),
|
|
511
|
-
(head_rect.right + 2, head_rect.top),
|
|
512
|
-
(head_rect.right + 2, head_rect.bottom),
|
|
513
|
-
]
|
|
514
|
-
|
|
515
|
-
pygame.draw.rect(surface, body_color, body_rect, border_radius=2)
|
|
516
|
-
pygame.draw.rect(surface, trim_color, body_rect, width=1, border_radius=2)
|
|
517
|
-
pygame.draw.rect(surface, head_color, head_rect, border_radius=2)
|
|
518
|
-
pygame.draw.rect(surface, trim_color, head_rect, width=1, border_radius=2)
|
|
519
|
-
pygame.draw.polygon(surface, beam_color, beam_points)
|
|
520
|
-
return surface
|
|
570
|
+
def build_shoes_surface(width: int, height: int) -> pygame.Surface:
|
|
571
|
+
return _draw_polygon_surface(width, height, SHOES_SPEC)
|
|
521
572
|
|
|
522
573
|
|
|
523
574
|
__all__ = [
|
|
@@ -539,4 +590,5 @@ __all__ = [
|
|
|
539
590
|
"paint_zombie_surface",
|
|
540
591
|
"build_fuel_can_surface",
|
|
541
592
|
"build_flashlight_surface",
|
|
593
|
+
"build_shoes_surface",
|
|
542
594
|
]
|
|
@@ -30,21 +30,19 @@ class RenderAssets:
|
|
|
30
30
|
player_radius: int
|
|
31
31
|
fov_radius: int
|
|
32
32
|
fog_radius_scale: float
|
|
33
|
-
fog_hatch_pixel_scale: int
|
|
34
33
|
fog_rings: list[FogRing]
|
|
35
34
|
footprint_radius: int
|
|
36
35
|
footprint_overview_radius: int
|
|
37
36
|
footprint_lifetime_ms: int
|
|
38
37
|
footprint_min_fade: float
|
|
39
38
|
internal_wall_grid_snap: int
|
|
40
|
-
flashlight_bonus_step: float
|
|
41
39
|
flashlight_hatch_extra_scale: float
|
|
42
40
|
|
|
43
41
|
|
|
44
42
|
FOG_RADIUS_SCALE = 1.2
|
|
45
|
-
FOG_HATCH_PIXEL_SCALE = 2
|
|
46
43
|
|
|
47
|
-
|
|
44
|
+
FLASHLIGHT_FOG_SCALE_ONE = FOG_RADIUS_SCALE + 0.3
|
|
45
|
+
FLASHLIGHT_FOG_SCALE_TWO = FOG_RADIUS_SCALE + 0.6
|
|
48
46
|
FLASHLIGHT_HATCH_EXTRA_SCALE = 0.12
|
|
49
47
|
|
|
50
48
|
FOOTPRINT_RADIUS = 2
|
|
@@ -53,12 +51,22 @@ FOOTPRINT_COLOR = (110, 200, 255)
|
|
|
53
51
|
FOOTPRINT_LIFETIME_MS = 135000
|
|
54
52
|
FOOTPRINT_MIN_FADE = 0.3
|
|
55
53
|
|
|
54
|
+
SHADOW_OVERSAMPLE = 2
|
|
55
|
+
SHADOW_STEPS = 10
|
|
56
|
+
SHADOW_MIN_RATIO = 0.0
|
|
57
|
+
SHADOW_RADIUS_RATIO = 0.3
|
|
58
|
+
ENTITY_SHADOW_RADIUS_MULT = 1.8
|
|
59
|
+
ENTITY_SHADOW_ALPHA = 48
|
|
60
|
+
ENTITY_SHADOW_EDGE_SOFTNESS = 0.32
|
|
61
|
+
PLAYER_SHADOW_RADIUS_MULT = 1.6
|
|
62
|
+
PLAYER_SHADOW_ALPHA_MULT = 0.8
|
|
63
|
+
|
|
56
64
|
FOG_RINGS = [
|
|
57
|
-
FogRing(radius_factor=0.
|
|
58
|
-
FogRing(radius_factor=0.
|
|
59
|
-
FogRing(radius_factor=0.
|
|
60
|
-
FogRing(radius_factor=0.
|
|
61
|
-
FogRing(radius_factor=0.
|
|
65
|
+
FogRing(radius_factor=0.536, thickness=2),
|
|
66
|
+
FogRing(radius_factor=0.645, thickness=3),
|
|
67
|
+
FogRing(radius_factor=0.754, thickness=5),
|
|
68
|
+
FogRing(radius_factor=0.863, thickness=8),
|
|
69
|
+
FogRing(radius_factor=0.972, thickness=12),
|
|
62
70
|
]
|
|
63
71
|
|
|
64
72
|
|
|
@@ -70,14 +78,12 @@ def build_render_assets(cell_size: int) -> RenderAssets:
|
|
|
70
78
|
player_radius=PLAYER_RADIUS,
|
|
71
79
|
fov_radius=FOV_RADIUS,
|
|
72
80
|
fog_radius_scale=FOG_RADIUS_SCALE,
|
|
73
|
-
fog_hatch_pixel_scale=FOG_HATCH_PIXEL_SCALE,
|
|
74
81
|
fog_rings=FOG_RINGS,
|
|
75
82
|
footprint_radius=FOOTPRINT_RADIUS,
|
|
76
83
|
footprint_overview_radius=FOOTPRINT_OVERVIEW_RADIUS,
|
|
77
84
|
footprint_lifetime_ms=FOOTPRINT_LIFETIME_MS,
|
|
78
85
|
footprint_min_fade=FOOTPRINT_MIN_FADE,
|
|
79
86
|
internal_wall_grid_snap=cell_size,
|
|
80
|
-
flashlight_bonus_step=FLASHLIGHT_FOG_SCALE_STEP,
|
|
81
87
|
flashlight_hatch_extra_scale=FLASHLIGHT_HATCH_EXTRA_SCALE,
|
|
82
88
|
)
|
|
83
89
|
|
|
@@ -93,7 +99,17 @@ __all__ = [
|
|
|
93
99
|
"FogRing",
|
|
94
100
|
"RenderAssets",
|
|
95
101
|
"FOG_RADIUS_SCALE",
|
|
96
|
-
"
|
|
102
|
+
"FLASHLIGHT_FOG_SCALE_ONE",
|
|
103
|
+
"FLASHLIGHT_FOG_SCALE_TWO",
|
|
104
|
+
"SHADOW_OVERSAMPLE",
|
|
105
|
+
"SHADOW_STEPS",
|
|
106
|
+
"SHADOW_MIN_RATIO",
|
|
107
|
+
"SHADOW_RADIUS_RATIO",
|
|
108
|
+
"ENTITY_SHADOW_RADIUS_MULT",
|
|
109
|
+
"ENTITY_SHADOW_ALPHA",
|
|
110
|
+
"ENTITY_SHADOW_EDGE_SOFTNESS",
|
|
111
|
+
"PLAYER_SHADOW_RADIUS_MULT",
|
|
112
|
+
"PLAYER_SHADOW_ALPHA_MULT",
|
|
97
113
|
"FLASHLIGHT_HATCH_EXTRA_SCALE",
|
|
98
114
|
"build_render_assets",
|
|
99
115
|
]
|
|
@@ -21,6 +21,7 @@ from ..gameplay import (
|
|
|
21
21
|
nearest_waiting_car,
|
|
22
22
|
place_flashlights,
|
|
23
23
|
place_fuel_can,
|
|
24
|
+
place_shoes,
|
|
24
25
|
process_player_input,
|
|
25
26
|
setup_player_and_cars,
|
|
26
27
|
spawn_initial_zombies,
|
|
@@ -118,31 +119,49 @@ def gameplay_screen(
|
|
|
118
119
|
|
|
119
120
|
spawn_survivors(game_data, layout_data)
|
|
120
121
|
|
|
122
|
+
occupied_centers: set[tuple[int, int]] = set()
|
|
121
123
|
if stage.requires_fuel:
|
|
122
124
|
fuel_spawn_count = stage.fuel_spawn_count
|
|
123
125
|
fuel_can = place_fuel_can(
|
|
124
126
|
layout_data["walkable_cells"],
|
|
125
127
|
player,
|
|
126
128
|
cars=game_data.waiting_cars,
|
|
129
|
+
reserved_centers=occupied_centers,
|
|
127
130
|
count=fuel_spawn_count,
|
|
128
131
|
)
|
|
129
132
|
if fuel_can:
|
|
130
133
|
game_data.fuel = fuel_can
|
|
131
134
|
game_data.groups.all_sprites.add(fuel_can, layer=1)
|
|
135
|
+
occupied_centers.add(fuel_can.rect.center)
|
|
132
136
|
flashlight_count = stage.initial_flashlight_count
|
|
133
137
|
flashlights = place_flashlights(
|
|
134
138
|
layout_data["walkable_cells"],
|
|
135
139
|
player,
|
|
136
140
|
cars=game_data.waiting_cars,
|
|
141
|
+
reserved_centers=occupied_centers,
|
|
137
142
|
count=max(0, flashlight_count),
|
|
138
143
|
)
|
|
139
144
|
game_data.flashlights = flashlights
|
|
140
145
|
game_data.groups.all_sprites.add(flashlights, layer=1)
|
|
146
|
+
for flashlight in flashlights:
|
|
147
|
+
occupied_centers.add(flashlight.rect.center)
|
|
148
|
+
|
|
149
|
+
shoes_count = stage.initial_shoes_count
|
|
150
|
+
shoes_list = place_shoes(
|
|
151
|
+
layout_data["walkable_cells"],
|
|
152
|
+
player,
|
|
153
|
+
cars=game_data.waiting_cars,
|
|
154
|
+
reserved_centers=occupied_centers,
|
|
155
|
+
count=max(0, shoes_count),
|
|
156
|
+
)
|
|
157
|
+
game_data.shoes = shoes_list
|
|
158
|
+
game_data.groups.all_sprites.add(shoes_list, layer=1)
|
|
141
159
|
|
|
142
160
|
spawn_initial_zombies(game_data, player, layout_data, config)
|
|
143
161
|
update_footprints(game_data, config)
|
|
144
162
|
while True:
|
|
145
163
|
dt = clock.tick(fps) / 1000.0
|
|
164
|
+
current_fps = clock.get_fps()
|
|
146
165
|
if game_data.state.game_over or game_data.state.game_won:
|
|
147
166
|
if game_data.state.game_won:
|
|
148
167
|
record_stage_clear(stage.id)
|
|
@@ -156,6 +175,7 @@ def gameplay_screen(
|
|
|
156
175
|
game_data,
|
|
157
176
|
config=config,
|
|
158
177
|
hint_color=None,
|
|
178
|
+
fps=current_fps,
|
|
159
179
|
present_fn=present,
|
|
160
180
|
)
|
|
161
181
|
if game_data.state.game_over_message:
|
|
@@ -259,6 +279,7 @@ def gameplay_screen(
|
|
|
259
279
|
game_data,
|
|
260
280
|
config=config,
|
|
261
281
|
do_flip=not show_pause_overlay,
|
|
282
|
+
fps=current_fps,
|
|
262
283
|
present_fn=present,
|
|
263
284
|
)
|
|
264
285
|
if show_pause_overlay:
|
|
@@ -327,7 +348,11 @@ def gameplay_screen(
|
|
|
327
348
|
car_ref = game_data.car
|
|
328
349
|
pad_vector = read_gamepad_move(controller, joystick)
|
|
329
350
|
player_dx, player_dy, car_dx, car_dy = process_player_input(
|
|
330
|
-
keys,
|
|
351
|
+
keys,
|
|
352
|
+
player_ref,
|
|
353
|
+
car_ref,
|
|
354
|
+
shoes_count=game_data.state.shoes_count,
|
|
355
|
+
pad_input=pad_vector,
|
|
331
356
|
)
|
|
332
357
|
update_entities(
|
|
333
358
|
game_data,
|
|
@@ -407,6 +432,7 @@ def gameplay_screen(
|
|
|
407
432
|
config=config,
|
|
408
433
|
hint_target=hint_target,
|
|
409
434
|
hint_color=hint_color,
|
|
435
|
+
fps=current_fps,
|
|
410
436
|
present_fn=present,
|
|
411
437
|
)
|
|
412
438
|
|
zombie_escape/stage_constants.py
CHANGED
|
@@ -156,6 +156,7 @@ STAGES: list[Stage] = [
|
|
|
156
156
|
zombie_aging_duration_frames=ZOMBIE_AGING_DURATION_FRAMES * 2,
|
|
157
157
|
initial_interior_spawn_rate=0.1,
|
|
158
158
|
waiting_car_target_count=1,
|
|
159
|
+
initial_shoes_count=1,
|
|
159
160
|
),
|
|
160
161
|
Stage(
|
|
161
162
|
id="stage12",
|
|
@@ -176,6 +177,7 @@ STAGES: list[Stage] = [
|
|
|
176
177
|
],
|
|
177
178
|
initial_flashlight_count=5,
|
|
178
179
|
zombie_aging_duration_frames=ZOMBIE_AGING_DURATION_FRAMES * 2,
|
|
180
|
+
initial_shoes_count=1,
|
|
179
181
|
),
|
|
180
182
|
Stage(
|
|
181
183
|
id="stage13",
|
|
@@ -198,32 +200,47 @@ STAGES: list[Stage] = [
|
|
|
198
200
|
for y in range(2, DEFAULT_GRID_ROWS - 2, 4)
|
|
199
201
|
for x in range(2, DEFAULT_GRID_COLS - 2, 4)
|
|
200
202
|
],
|
|
203
|
+
initial_shoes_count=1,
|
|
201
204
|
),
|
|
202
205
|
Stage(
|
|
203
206
|
id="stage14",
|
|
204
207
|
name_key="stages.stage14.name",
|
|
205
208
|
description_key="stages.stage14.description",
|
|
206
|
-
grid_cols=
|
|
207
|
-
grid_rows=
|
|
208
|
-
available=
|
|
209
|
+
grid_cols=34,
|
|
210
|
+
grid_rows=20,
|
|
211
|
+
available=True,
|
|
209
212
|
requires_fuel=True,
|
|
210
213
|
exterior_spawn_weight=0.2,
|
|
211
214
|
interior_spawn_weight=0.1,
|
|
212
215
|
interior_fall_spawn_weight=0.7,
|
|
216
|
+
fall_spawn_floor_ratio=0.05,
|
|
217
|
+
initial_flashlight_count=3,
|
|
218
|
+
zombie_aging_duration_frames=ZOMBIE_AGING_DURATION_FRAMES * 2,
|
|
219
|
+
initial_shoes_count=1,
|
|
220
|
+
),
|
|
221
|
+
Stage(
|
|
222
|
+
id="stage15",
|
|
223
|
+
name_key="stages.stage15.name",
|
|
224
|
+
description_key="stages.stage15.description",
|
|
225
|
+
available=True,
|
|
226
|
+
buddy_required_count=1,
|
|
227
|
+
grid_cols=70,
|
|
228
|
+
grid_rows=20,
|
|
229
|
+
tile_size=35,
|
|
230
|
+
wall_algorithm="grid_wire",
|
|
231
|
+
requires_fuel=True,
|
|
232
|
+
initial_interior_spawn_rate=0.02,
|
|
233
|
+
exterior_spawn_weight=0.2,
|
|
234
|
+
interior_spawn_weight=0.1,
|
|
235
|
+
interior_fall_spawn_weight=0.7,
|
|
236
|
+
initial_flashlight_count=3,
|
|
237
|
+
zombie_normal_ratio=0.5,
|
|
238
|
+
zombie_wall_follower_ratio=0.5,
|
|
213
239
|
fall_spawn_zones=[
|
|
214
|
-
(
|
|
215
|
-
(5, 20, 3, 3),
|
|
216
|
-
(15, 17, 3, 3),
|
|
217
|
-
(22, 16, 3, 3),
|
|
218
|
-
(17, 20, 3, 3),
|
|
219
|
-
(26, 22, 3, 3),
|
|
220
|
-
(31, 17, 3, 3),
|
|
221
|
-
(33, 10, 3, 3),
|
|
222
|
-
(34, 7, 3, 3),
|
|
223
|
-
(35, 13, 3, 3),
|
|
240
|
+
(33, 2, 4, 16),
|
|
224
241
|
],
|
|
225
|
-
initial_flashlight_count=5,
|
|
226
242
|
zombie_aging_duration_frames=ZOMBIE_AGING_DURATION_FRAMES * 2,
|
|
243
|
+
initial_shoes_count=1,
|
|
227
244
|
),
|
|
228
245
|
]
|
|
229
246
|
DEFAULT_STAGE_ID = "stage1"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: zombie-escape
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.12.0
|
|
4
4
|
Summary: Top-down zombie survival game built with pygame.
|
|
5
5
|
Project-URL: Homepage, https://github.com/tos-kamiya/zombie-escape
|
|
6
6
|
Author-email: Toshihiro Kamiya <kamiya@mbj.nifty.com>
|
|
@@ -17,7 +17,7 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
|
17
17
|
Requires-Python: >=3.10
|
|
18
18
|
Requires-Dist: numpy
|
|
19
19
|
Requires-Dist: platformdirs
|
|
20
|
-
Requires-Dist: pygame
|
|
20
|
+
Requires-Dist: pygame-ce
|
|
21
21
|
Requires-Dist: python-i18n
|
|
22
22
|
Requires-Dist: typing-extensions; python_version < '3.11'
|
|
23
23
|
Provides-Extra: dev
|
|
@@ -48,6 +48,7 @@ This game is a simple 2D top-down action game where the player aims to escape by
|
|
|
48
48
|
<img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot1.png" width="400">
|
|
49
49
|
<img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot2.png" width="400">
|
|
50
50
|
<img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot3.png" width="400">
|
|
51
|
+
<img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot4.png" width="400">
|
|
51
52
|
|
|
52
53
|
## Controls
|
|
53
54
|
|
|
@@ -154,6 +155,8 @@ zombie-escape
|
|
|
154
155
|
|
|
155
156
|
This project is licensed under the MIT License - see the [LICENSE.txt](LICENSE.txt) file for details.
|
|
156
157
|
|
|
158
|
+
This project depends on pygame-ce (repository: `https://github.com/pygame-community/pygame-ce`), which is licensed under GNU LGPL version 2.1.
|
|
159
|
+
|
|
157
160
|
The bundled Silkscreen-Regular.ttf font follows the license terms of its original distribution.
|
|
158
161
|
Please refer to the upstream website for details: https://fonts.google.com/specimen/Silkscreen
|
|
159
162
|
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
zombie_escape/__about__.py,sha256=kNaFL79PgwLtvJEtktI5T51KrzNULqPSzAhOAofAB4w,135
|
|
2
|
+
zombie_escape/__init__.py,sha256=YSQnUghet8jxSvaGmKfzHfXXLlnvWh_xk10WGTDO2HM,173
|
|
3
|
+
zombie_escape/colors.py,sha256=5MNq3MSBiSA2jNhyWIsgHU2qEo4wV0bTyD3-NDhUrbg,6631
|
|
4
|
+
zombie_escape/config.py,sha256=Ncvsz6HzBknSjecorkm7CrkrzWUIksD30ykLPueanyw,2008
|
|
5
|
+
zombie_escape/entities.py,sha256=ag4OXcx8F_pZIzO_9cRxpbKhskiQbfbzXdZeXHNi7qI,54410
|
|
6
|
+
zombie_escape/entities_constants.py,sha256=TJvNcANkH0slpXDFfF51S5LyIYGn4xEW-oMjEFXuuYc,3198
|
|
7
|
+
zombie_escape/font_utils.py,sha256=kkjcSlCTG3jO5zf5XUnirpJ-iL_Eg8ahzjZYGijF2JY,1206
|
|
8
|
+
zombie_escape/gameplay_constants.py,sha256=MdchWDi3p1xUOZuDsl5eH9KjazuApjuIYEddHkazEsw,984
|
|
9
|
+
zombie_escape/input_utils.py,sha256=0SHENZi5y-ybSxUX569RHihI_xbQWSI0FQ1q1ZE9U1c,5795
|
|
10
|
+
zombie_escape/level_blueprints.py,sha256=FbmiAaazw7sRj_OF_5EuVJJDklVKpHZM_qVff41K9Z0,11297
|
|
11
|
+
zombie_escape/level_constants.py,sha256=fSrPXfkuKHlv9XqmaRq6aR9UhjpqZK2iJJgMc-TXGXc,281
|
|
12
|
+
zombie_escape/localization.py,sha256=gp26FN_Od4eOeIK2aY0_QZ-9THw6yENh-cGTwglnMxw,6118
|
|
13
|
+
zombie_escape/models.py,sha256=TWFL3ZMjW3Tyj9xHEyO9OW_3lWl0Rxqiu4wX2M6pFp8,5006
|
|
14
|
+
zombie_escape/progress.py,sha256=WCFc7JeMY6noBjnTIFyHrXQJSM1j8PwyPA7S8ZQwjTE,1713
|
|
15
|
+
zombie_escape/render.py,sha256=RfCOYoY9IZByoWkSAL_YofPDSg_dZaTLe3OEWdl-PUA,53611
|
|
16
|
+
zombie_escape/render_assets.py,sha256=z9-CtwQ52sR7UqTwYFTWxaAyv6AIGuCkiOygQBNaXM8,16896
|
|
17
|
+
zombie_escape/render_constants.py,sha256=4xUd4V3VL4FApvHg8POCuMU4ttTdK9cvG1kzcWJmeNQ,3103
|
|
18
|
+
zombie_escape/rng.py,sha256=gMAgpzYoNN1FxRG3aQ9fdXTDNAg48Rqz8YnB1nJ4Fpw,3787
|
|
19
|
+
zombie_escape/screen_constants.py,sha256=MJaTlSWfN4VtN6pMqPQ6LF34XdJm0wqYLuRwa1pQuAU,559
|
|
20
|
+
zombie_escape/stage_constants.py,sha256=GqS1WLEEbO8CElx5757gLdTWW86w11Yd2URLG2JPn3M,7883
|
|
21
|
+
zombie_escape/world_grid.py,sha256=9ZKaur2fBOXiZEg5WlaAnoeHV6Lda092rJROraMW6zk,4553
|
|
22
|
+
zombie_escape/zombie_escape.py,sha256=mIrKb3iJed6KPem7fmcnL9yKkWWLIXTX5McoVcVIN8E,8492
|
|
23
|
+
zombie_escape/assets/fonts/Silkscreen-Regular.ttf,sha256=SVZ0CGAICeJRR-kiWsTzf0EOLfRadQaWxFAnUx-2Xxs,31960
|
|
24
|
+
zombie_escape/assets/fonts/misaki_gothic.ttf,sha256=CWPhHonV-kCaegSKUujqLWI9dkp5mEiPikKRERYRxOE,1171204
|
|
25
|
+
zombie_escape/gameplay/__init__.py,sha256=Q-6ifVss8Adnoo1hh9aUcN1fug6wXFVNkiFTWSHkazk,2387
|
|
26
|
+
zombie_escape/gameplay/ambient.py,sha256=hoCOz6ciyejU0nmJwdLqmVfaoo-01CrVSMRLpFMz93w,1446
|
|
27
|
+
zombie_escape/gameplay/constants.py,sha256=x_-b67fgvejZj00_lE-oJITcntb0Oi2ba2Zu9QyL3-0,1009
|
|
28
|
+
zombie_escape/gameplay/footprints.py,sha256=0yY6X3lI7bRL7kXS-ArWBqIipqrQdj8YJB3ryQuLrVE,1795
|
|
29
|
+
zombie_escape/gameplay/interactions.py,sha256=ETfa2BHvTxxI4PLV5wuOHRz5aCMIGljqXi7-3hVULNA,13922
|
|
30
|
+
zombie_escape/gameplay/layout.py,sha256=UXpBi_AOzaYndajqCqKENsIXqkoJmiZl-qxzrZW76GM,8823
|
|
31
|
+
zombie_escape/gameplay/movement.py,sha256=v3D1qr3zAcabektC6RXiJZ6Bsg8h9wPArH3hO6xP6Z4,9529
|
|
32
|
+
zombie_escape/gameplay/spawn.py,sha256=sRHXi5d_RgT9e4EhKHL-Wc78F2kNL3lbQGtpzeyF30Q,30686
|
|
33
|
+
zombie_escape/gameplay/state.py,sha256=4Kedqg2bmmL8tP62vCNCyZVUJytY_LHCygph8qm0QPE,4590
|
|
34
|
+
zombie_escape/gameplay/survivors.py,sha256=ruQqSiZZslARviUej_RQS3hlAnxA8DQZkE32fPPsHuk,11877
|
|
35
|
+
zombie_escape/gameplay/utils.py,sha256=4M9gkLbcE9nhUqLzBPGGF4nPSqZpbEhH4SjUZAwSd64,5805
|
|
36
|
+
zombie_escape/locales/ui.en.json,sha256=fHsEThNTKjVs3n1PEvdJLywxfk-HwZrHVAnnBPu5nZI,6505
|
|
37
|
+
zombie_escape/locales/ui.ja.json,sha256=ryOHPyiGxn8vGeDR7Q2ueIVoP-mA6dS1yDMhejjpPiQ,7079
|
|
38
|
+
zombie_escape/screens/__init__.py,sha256=BFLQzXqyrAhmm6b_2wlnK7lMm_n5HvBklVrzrJRwRn0,8387
|
|
39
|
+
zombie_escape/screens/game_over.py,sha256=a6udonlPr5HRQRMTjb2Y-Iu_ViOl1uuZK9TpUYNkiK8,6709
|
|
40
|
+
zombie_escape/screens/gameplay.py,sha256=B0rPugoGW82MpmmLTYKy4aDujw6rp_cNmT-aYxFG-tU,16125
|
|
41
|
+
zombie_escape/screens/settings.py,sha256=qgcnq8k-yeRbqweT9GsIefKWKvjOON_Gs2_SCZChY-8,21739
|
|
42
|
+
zombie_escape/screens/title.py,sha256=1LUEMTmFLmJNL0TKTbnP2oRGWb6zUV28d8sQQo8i3Po,23118
|
|
43
|
+
zombie_escape-1.12.0.dist-info/METADATA,sha256=Gd8c1J7rqlsaABKpNtEhYW89b9HZtWDFNbtgcIdRUo4,10718
|
|
44
|
+
zombie_escape-1.12.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
45
|
+
zombie_escape-1.12.0.dist-info/entry_points.txt,sha256=JprxC-vvkBJgsOp0WJnGBZRJ_ESjjmyS-nsPExeiLHU,49
|
|
46
|
+
zombie_escape-1.12.0.dist-info/licenses/LICENSE.txt,sha256=q-cJYG_K766eXSxQ7txWcWQ6nS2OF6c3HTVLesHbesU,1104
|
|
47
|
+
zombie_escape-1.12.0.dist-info/RECORD,,
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
zombie_escape/__about__.py,sha256=rD0DkxtvcakK5xudYs0CYK3HVkzEUVrQ_oH-aR5EFkw,135
|
|
2
|
-
zombie_escape/__init__.py,sha256=YSQnUghet8jxSvaGmKfzHfXXLlnvWh_xk10WGTDO2HM,173
|
|
3
|
-
zombie_escape/colors.py,sha256=yD7pO4ZUBsm-saO0Fvwmxc1OO6aOnzMNU5TA6GTCt7Y,6629
|
|
4
|
-
zombie_escape/config.py,sha256=Ncvsz6HzBknSjecorkm7CrkrzWUIksD30ykLPueanyw,2008
|
|
5
|
-
zombie_escape/entities.py,sha256=apMwSzkdxUMhOC2Q1l-ZKCD-Dsi_F0abOBXOfN7bXa8,54020
|
|
6
|
-
zombie_escape/entities_constants.py,sha256=9DsEF67OW_k4OUzIcuTfMGGEtxaKbvz8w9evv7B7Jm8,3097
|
|
7
|
-
zombie_escape/font_utils.py,sha256=kkjcSlCTG3jO5zf5XUnirpJ-iL_Eg8ahzjZYGijF2JY,1206
|
|
8
|
-
zombie_escape/gameplay_constants.py,sha256=I5g2xsd4Rck4d5tbWae2bm6Yfwp4ZAgujDLnDMsHxgM,758
|
|
9
|
-
zombie_escape/input_utils.py,sha256=0SHENZi5y-ybSxUX569RHihI_xbQWSI0FQ1q1ZE9U1c,5795
|
|
10
|
-
zombie_escape/level_blueprints.py,sha256=VZieyhG4kWd1l6u7_Owy2FxhYt63pWpvsmLx5yB8GOs,10609
|
|
11
|
-
zombie_escape/level_constants.py,sha256=fSrPXfkuKHlv9XqmaRq6aR9UhjpqZK2iJJgMc-TXGXc,281
|
|
12
|
-
zombie_escape/localization.py,sha256=gp26FN_Od4eOeIK2aY0_QZ-9THw6yENh-cGTwglnMxw,6118
|
|
13
|
-
zombie_escape/models.py,sha256=JTE9IysbWZUv9YAXaK62pf6Z5BFVhx_YG_8UMQxSiXw,4813
|
|
14
|
-
zombie_escape/progress.py,sha256=WCFc7JeMY6noBjnTIFyHrXQJSM1j8PwyPA7S8ZQwjTE,1713
|
|
15
|
-
zombie_escape/render.py,sha256=y0hMS42RX7eu9j7_rbWBkU8PQGpGJe2O5fTJJPv1xJM,42733
|
|
16
|
-
zombie_escape/render_assets.py,sha256=66lRKQZ9fII6930WeQchIJRFeLLu7J3Cr155svpDrUM,16489
|
|
17
|
-
zombie_escape/render_constants.py,sha256=d07yNUlnKvm-NgN4xuLUShuUUS5vVxHo-ytPIGiTYoA,2703
|
|
18
|
-
zombie_escape/rng.py,sha256=gMAgpzYoNN1FxRG3aQ9fdXTDNAg48Rqz8YnB1nJ4Fpw,3787
|
|
19
|
-
zombie_escape/screen_constants.py,sha256=MJaTlSWfN4VtN6pMqPQ6LF34XdJm0wqYLuRwa1pQuAU,559
|
|
20
|
-
zombie_escape/stage_constants.py,sha256=cslgIeGGQlVmZw00bgdG_j8ywA00MFWSTQU3j6kR6Sk,7289
|
|
21
|
-
zombie_escape/world_grid.py,sha256=9ZKaur2fBOXiZEg5WlaAnoeHV6Lda092rJROraMW6zk,4553
|
|
22
|
-
zombie_escape/zombie_escape.py,sha256=mIrKb3iJed6KPem7fmcnL9yKkWWLIXTX5McoVcVIN8E,8492
|
|
23
|
-
zombie_escape/assets/fonts/Silkscreen-Regular.ttf,sha256=SVZ0CGAICeJRR-kiWsTzf0EOLfRadQaWxFAnUx-2Xxs,31960
|
|
24
|
-
zombie_escape/assets/fonts/misaki_gothic.ttf,sha256=CWPhHonV-kCaegSKUujqLWI9dkp5mEiPikKRERYRxOE,1171204
|
|
25
|
-
zombie_escape/gameplay/__init__.py,sha256=l89oVjZysKEyb18JNWsZmbO-YCOrSaG8Cq2yCPqnntQ,2351
|
|
26
|
-
zombie_escape/gameplay/ambient.py,sha256=hoCOz6ciyejU0nmJwdLqmVfaoo-01CrVSMRLpFMz93w,1446
|
|
27
|
-
zombie_escape/gameplay/constants.py,sha256=x_-b67fgvejZj00_lE-oJITcntb0Oi2ba2Zu9QyL3-0,1009
|
|
28
|
-
zombie_escape/gameplay/footprints.py,sha256=0yY6X3lI7bRL7kXS-ArWBqIipqrQdj8YJB3ryQuLrVE,1795
|
|
29
|
-
zombie_escape/gameplay/interactions.py,sha256=WisFHyi9IX-RM2IamZ8R0t51yluqTTnALnPdn8CRCn4,13246
|
|
30
|
-
zombie_escape/gameplay/layout.py,sha256=f_BpBULO57hedE6-0-bmWlIKOajkwKndR9LELNmF6Ck,8015
|
|
31
|
-
zombie_escape/gameplay/movement.py,sha256=3P7sdDkVdmZcQxK87RXNvnGmMF50u8TSKN2vkqkti7o,9131
|
|
32
|
-
zombie_escape/gameplay/spawn.py,sha256=YTr8pvNHmSWVcSSArtIYjixrNua3pcFNtdHnTW6gceg,27969
|
|
33
|
-
zombie_escape/gameplay/state.py,sha256=7PzW0wY7rTjnA96jY-yg1YvJ6cjttwiAFipiFl98HGo,4549
|
|
34
|
-
zombie_escape/gameplay/survivors.py,sha256=ruQqSiZZslARviUej_RQS3hlAnxA8DQZkE32fPPsHuk,11877
|
|
35
|
-
zombie_escape/gameplay/utils.py,sha256=4M9gkLbcE9nhUqLzBPGGF4nPSqZpbEhH4SjUZAwSd64,5805
|
|
36
|
-
zombie_escape/locales/ui.en.json,sha256=Q8Tfu7tuA26UGNheDjG35wtlkWHnKWbK7eGeWhgvyQ0,6219
|
|
37
|
-
zombie_escape/locales/ui.ja.json,sha256=6zVN-GjeIERah17DjZtxcjwqrpUZwSc-NugyNd8CpTY,6773
|
|
38
|
-
zombie_escape/screens/__init__.py,sha256=BFLQzXqyrAhmm6b_2wlnK7lMm_n5HvBklVrzrJRwRn0,8387
|
|
39
|
-
zombie_escape/screens/game_over.py,sha256=fU60JWLd4JqbX0qg6qf2ziSLVaix4yCPip7VBQungvs,6693
|
|
40
|
-
zombie_escape/screens/gameplay.py,sha256=mE3kjuN4hEpnTZIwHn2csDsGIUuRQKp3p6vSsoNhUzY,15235
|
|
41
|
-
zombie_escape/screens/settings.py,sha256=qgcnq8k-yeRbqweT9GsIefKWKvjOON_Gs2_SCZChY-8,21739
|
|
42
|
-
zombie_escape/screens/title.py,sha256=1LUEMTmFLmJNL0TKTbnP2oRGWb6zUV28d8sQQo8i3Po,23118
|
|
43
|
-
zombie_escape-1.10.0.dist-info/METADATA,sha256=sdsYo-RXO2rQrQ76e-Coyvt3hTw89EJcC284xNsVJ1E,10462
|
|
44
|
-
zombie_escape-1.10.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
45
|
-
zombie_escape-1.10.0.dist-info/entry_points.txt,sha256=JprxC-vvkBJgsOp0WJnGBZRJ_ESjjmyS-nsPExeiLHU,49
|
|
46
|
-
zombie_escape-1.10.0.dist-info/licenses/LICENSE.txt,sha256=q-cJYG_K766eXSxQ7txWcWQ6nS2OF6c3HTVLesHbesU,1104
|
|
47
|
-
zombie_escape-1.10.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|