aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
blob: 361c45c5cbbe88d1db332147a367c748e7442261 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153

Pacman, a naive implementation of the classic game in C++

Original document location.

Git Repository

This project's canonical repositories is hosted on Gothel Software.

Goals

This project likes to demonstrate a complex system written in modern C++ for our computer science class.

Besides management of animated sprite graphics, maze environment and tile positioning, the interesting part might be the ghost's state machine and their movements.

To implement the original pacman game behavior like weighted tile collision, ghost algorithm, etc. - we have used the following documents for reference

The implementation is inspired by Toru Iwatani's original game Puckman.

Supported Platforms

C++17 and better where the SDL2 library is supported.

Building Binaries

The project requires make, g++ >= 8.3 and the libsdl2 for building.

Installing build dependencies on Debian (11 or better):

apt install git build-essential g++ gcc libc-dev make
apt install libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-mixer-dev

For a generic build use:

git clone https://jausoft.com/cgit/cs_class/pacman.git
cd pacman
make

The binary shall be build to bin/pacman.

Usage

Following commandline arguments are supported

  • -no_vsync to force off hardware enabled vsync, which in turn enables manual fps synchronization
  • -fps <int> to enforce a specific fps value, which will also set -no_vsync naturally
  • -speed <int> to set the 100% player speed in fields per seconds
  • `-wwidth to set the initial window width
  • `-wheight to set the initial window height
  • -show_fps to show pacman's speed and to periodically show the frames per seconds (fps) value on the console
  • -show_modes to show all players' mode changes
  • -show_moves to show all players' move criteria like distance and collisions incl. speed changes on the console
  • -show_targets to show the ghost's target position as a ray on the video screen
  • -show_debug_gfx to show all debug gfx
  • -show_all enable -show_modes, -show_moves, -show_targets and -show_debug_gfx
  • -no_ghosts to disable all ghosts
  • -bugfix to turn off the original puckman's behavior (bugs), see Bugfix Mode below.
  • -audio to turn on audio effects, i.e. playing the audio samples.
  • -level <int> to start at given level
bin/pacman [-no_vsync] [-fps <int>] [-speed <int>] [-wwidth <int>] [-wheight <int>] [-show_fps] [-show_modes] [-show_moves] [-show_targets] [-show_debug_gfx] [-show_all] [-no_ghosts] [-bugfix] [-audio] [-level <int>]

Bugfix Mode

With the -bugfix mode enabled, see Usage above, the original puckman behavior (bugs) are disabled.

The list below shall be updated in case we further the implementation and kept in sync with include/pacman/globals.hpp.

By default the original pacman behavior is being implemented:

  • weighted (round) tile position for collision tests
  • pinky's up-target not 4 ahead, but 4 ahead and 4 to the left
  • ...

If false, a more accurate implementation, the pacman bugfix, is used:

  • pixel accurate tile position for collision tests
  • pinky's up-traget to be 4 ahead as intended
  • ...

Implementation Status

Done

  • Maze
    • Read maze specification from text file
  • Sprites
  • Speed per tile accurate key-frame animation
    • Weighted tile position from floating position
    • Renderer fps derived step width, i.e. sub-tiles
    • Sync speed by dropping tick, every n-frames
  • Ghost AI
    • Scared RNG target
    • Scatter, chase and phantom targets
    • Next direction_t algo
    • Grouped wave switch of scatter, chase and frightened
    • Exit home using local and global pellet timer
    • PRNG with an identical seed value every new level and life for predictable results
    • Adjust tunnel speed
    • No turning up in Red-Zones if chasing or scattering
  • Pacman
    • show eaten ghosts score onscreen (FREEZE)
  • Level specification (per level)
    • Timings
      • scatter and chase duration per phase
      • frightening/powered duration
    • Speed
      • pacman normal on empty tile or eating
      • pacman powered on empty tile or eating
      • ghost speed normal, frightening or in tunnel
    • Score
  • Score
    • ghost 1-4 per power pellet
  • Sound
    • Using wav chunks, mixed from seperated channels

To Do

  • Ghost AI
    • Elroy 1+2 mode
  • Score
    • Fruits / Bonus
  • Pacman
    • Lives
    • Freeze pacman only for 3 frames after eating power pellet
  • Sound
    • Use lossy formats
    • Complete samples
  • Extension
    • Second player moves a ghost
  • Maze
    • Render maze itself from maze-spec file
  • Persistent game state
    • Save/load game state
    • Screenshot
    • Record video

Media Data

The pixel data in media/playfield_pacman.png and media/tiles_all.png are copied from Arcade - Pac-Man - General Sprites.png, which were submitted and created by Superjustinbros and assumed to be in the public domain.

Changes

0.0.1

  • Initial commit with working status and prelim ghost algorithm.