Subversion Repositories Games.Prince of Persia

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 pmbaty 1
Fixed bugs:
2
===========
3
 
4
signed vs. unsigned
5
same thing with multiple names (kid_room vs. kid.room)
6
pop_main: break;
7
	# Level selection: 10 meant 1
8
+ vs. - in draw_mid
9
	# Wrong y-pos
10
draw_back_fore: which_table == 0 instead of 1
11
	# Foretable was not drawn
12
sub_B726/redraw_needed_tiles: --drawn_col should be ++drawn_col
13
	# How did it work?
14
process_key: if (start_level == 0) was !=
15
	# Shift or enter restarted level
16
process_key: next_level = current_level + 1; was ++
17
	# Shift-L didn't work
18
play_level_2: if (next_level == current_level || check_sound_playing()) { was || ! check_...
19
draw_tile_fore: wall_pattern(1, 0); should be wall_pattern(1, 1);
20
	# Badly drawn wall
21
load_lev_spr: release_dathandle(dathandle); was release_dathandle();
22
	# Guard.dat not released
23
add_drect: the loop
24
	# Not redrawn
25
get_curr_tile: missing & 0x1F
26
check_spike_below: not_finished = 0; was outside do
27
	# HANG
28
down_pressed:
29
	bad:
30
	distance_to_edge_weight();
31
	char_.x = char_dx_forward(9);
32
	good:
33
	char_.x = char_dx_forward(distance_to_edge_weight() - 9);
34
	# Can't press button
35
load_frame_to_obj:
36
	bad:
37
	if ((cur_frame.flags ^ obj_direction) & 0x80) {
38
	good:
39
	if ((cur_frame.flags ^ obj_direction) >= 0) {
40
	# Bad xpos
41
land: if (! tile_is_floor(get_tile_behind_char()) && was if(tile_...
42
leave_room:
43
	bad:
44
		if (curr_tile2 != tiles_7_doortop_with_floor &&
45
			curr_tile2 != tiles_12_doortop
46
		) {
47
			if (char_x_right >= 201) {
48
	good:
49
		if (curr_tile2 != tiles_7_doortop_with_floor &&
50
			curr_tile2 != tiles_12_doortop &&
51
			char_x_right >= 201
52
		) {
53
	missing:
54
		} else {
55
			return -1;
56
		}
57
sub_54A5: short var_A; was word
58
sub_55BD: char_.frame < 135 || char_.frame >= 149  =>  (char_.frame < 135 || char_.frame >= 149)
59
check_chomped: short was word
60
sub_5D9B/dist_from_wall_behind: - 13; was +
61
sub_562A: get_left_wall_xpos was get_right_wall_xpos
62
back_pressed: || dist... was && dist...
63
land: if (! take_hp(1)) { was if(take_...
64
	# Kid died from two-row falls
65
do_paused: while (! process_key()); had no !
66
leave_room: chary > -16 was 240
67
down_pressed: ! tile_is_floor had no !
68
	else crouch2()
69
mob_down_a_row: missing - 1
70
	# Loose that fell out of room appeared at wrong place
71
read_keyb_control: control_shift = -(...) had no -
72
	# didn't notice shift
73
get_some_tile: if (tile_type(tile) != 0) { was too long
74
control_hanging: char_.direction == dir_FF_left was !=
75
	action and wall were separate
76
hang_fall: ! missing (2*)
77
guard_notice: else missing
78
loose_land: case (0, BAD!) 1 missing
79
	# loose
80
is_spike_harmful: short->byte
81
do_trigger_list: != was ==
82
	# buttons didn't work
83
trigger_1: missing result=
84
	# buttons didn't work (?)
85
anim_door: array boundary
86
	# gate didn't close
87
anim_guard: char_frame <= 150 -> >=
88
control_hanging: if (! tile_is_floor( had no !
89
jump_up: } else if (! tile_is_floor( had no !
90
SWAP left and right + dir_front/behind + get_tile_...
91
	# VERY silly
92
draw_gate_fore: missing -2
93
	# Gate looks bad if kid is behind it
94
do_paused: && -> ||
95
sub_5840: 2 ifs -> 1 if &&
96
	# Go through wall
97
sub_BAD5: missing == tiles_0_empty
98
redraw_at_char2: >= 80 was >
99
redraw_at_char: short was word
100
do_mobs: short was word
101
do_mobs: mobs[new_index++] = mobs[index]; was flipped
102
	# If multiple loose floors were falling
103
level12_shadow_anim: if (can_guard_see_kid < 2 was >=
104
extern sbyte byte_1F00E; was byte
105
extern sbyte byte_1EFD2; was byte
106
leave_room: added (sbyte) cast
107
	# Can't go up to other room
108
check_can_guard_see_kid: word -> short
109
extern short obj_x; was word
110
	# When run-jumping out of a room, kid suddenly appears in the middle
111
do_control: very silly
112
do_control: if ((word)var_2 < (word)-6) { was var_2 < 6
113
dx_weight: word -> sbyte
114
get_tile_div_mod_m7: missing return
115
check_action: missing else (or return)
116
	# level 1: shift -> wants to grab (in_wall???)
117
clip_char:
118
	bad:
119
			if (action != actions_0_stand && (frame == 79 || frame == 81) ||
120
				get_tile(room, char_col_left, char_top_row) == tiles_20_wall ||
121
				tile_is_floor(curr_tile2)
122
			) {
123
	good:
124
			if (action == actions_0_stand && (frame == 79 || frame == 81) ||
125
				get_tile(room, char_col_right, char_top_row) == tiles_20_wall ||
126
				tile_is_floor(curr_tile2)
127
			) {
128
check_press: else return;
129
	# Can't break loose floor from above (breaks 2 tiles to the right)
130
fell_on_your_head: frame < 5 || was &&
131
	# Landing loose won't hurt kid
132
play_seq: missing is_guard_notice = 1;
133
	# Guard doesn't hear footsteps
134
dist_from_wall_forward: ! can_bump_into_gate() had no !
135
	# Kid wants to run towards gate instead of stepping (but he steps if it's open) + when he bumps into gate, pushed to wrong position
136
redraw_at_char: short was word
137
	# Level 4 right: bump into gate, then turn around -> game hangs
138
set_clip_rect: ptr_scrninfo was surface
139
	# no clipping at all
140
	# When climbing up to floor: not overlaid (direction = right)
141
reset_clip_rect: ptr_scrninfo was surface
142
clip_char:
143
	bad(?):
144
			if ((get_tile(room, col, row) == tiles_7_doortop_with_floor ||
145
				curr_tile2 == tiles_12_doortop) &&
146
				action == actions_3_in_midair ||
147
				action == actions_4_in_freefall && frame == 106 ||
148
				action == actions_5_bumped && frame == 107 ||
149
				char_.direction < 0 && (
150
					action == actions_2_hang_climb ||
151
					action == actions_6_hang_straight ||
152
					action == actions_1_run_jump &&
153
					frame >= 137 && frame < 140
154
				)
155
			) {
156
	good(?):
157
			if ((get_tile(room, col, row) != tiles_7_doortop_with_floor &&
158
				curr_tile2 != tiles_12_doortop) ||
159
				action == actions_3_in_midair ||
160
				action == actions_4_in_freefall && frame == 106 ||
161
				action == actions_5_bumped && frame == 107 ||
162
				char_.direction < 0 && (
163
					action == actions_2_hang_climb ||
164
					action == actions_6_hang_straight ||
165
					action == actions_1_run_jump &&
166
					frame >= 137 && frame < 140
167
				)
168
			) {
169
	# Kid can be seen through doortop
170
set_joy_mode: need_clear_kbdbuf = 1;
171
	# Home/Page Up doesn't jump if I press it only shortly
172
method_3_blit_mono: , 0x10); was 0
173
	# potion bubbles have a black background
174
draw_image_2:
175
	# title texts are grey
176
animate_chomper: modifier > 15 was >=
177
	bad:
178
		if ((trob.room != drawn_room || trob.tile / 10 != kid.curr_row)
179
			&& kid.alive >= 0 && var_2 == 0 && (curr_modifier & 0x7F) >= 6
180
		) {
181
	bad 2:
182
		if ((trob.room != drawn_room || trob.tile / 10 != kid.curr_row) ||
183
			kid.alive >= 0 && var_2 == 0 && (curr_modifier & 0x7F) >= 6
184
		) {
185
	# Level 8: 2 chompers move even if kid is not in top row
186
	# chompers don't stop if kid leaves their row
187
	good:
188
		if ((trob.room != drawn_room || trob.tile / 10 != kid.curr_row ||
189
			kid.alive >= 0 && var_2 == 0) && (curr_modifier & 0x7F) >= 6
190
		) {
191
	# chompers get stuck if kid leaves their row
192
start_chompers: if ((byte)char_.curr_row < 3) { was if(char_
193
	# Level 7 room 2: chomper moves weird ---- now it's stuck
194
load_lev_spr:
195
	# guard1/2.dat not released
196
stand_flipped: if (control_forward < 0) { was >
197
	# Guard turns away from kid (guard_notice: move_down_forw); anim_guard_2 ? do_control ? stand_flipped?
198
take_hp: dead = 1; missing from guard
199
	# guard steps back before dying
200
sub_509A:
201
	bad:
202
	char_.fall_y = char_.y = y_land[char_.curr_row + 1];
203
	good:
204
	char_.y = y_land[char_.curr_row + 1];
205
	char_.fall_y = 0;
206
	# when guard bumps kid, kid flies out of room
207
get_some_tile: missing else branch of distance != 0
208
hurt_by_sword: missing:
209
			char_.y = y_land[char_.curr_row + 1];
210
			char_.fall_y = 0;
211
	# When guard pokes kid when kid is jumping, kid dies in air.
212
anim_guard: missing return; after <50
213
check_hurting: if (char_.frame == 154) { was char_frame
214
	if (char_.frame == 154 && opp.frame != 161 was char_frame and opp_frame
215
control_with_sword:
216
	if ((word)distance < (word)90) { had no (word) cast
217
	if ((word)distance < (word)-4) {  had no (word) cast
218
	# kid/guard won't turn around if guard/kid is behind him; guard goes forward
219
show_time: rem_min != 0 was missing
220
	rem_min % 5 == 0 was !=
221
jump_up2: char_dx_forward(distance - 3); was (3);
222
	# Level 2 room 4: When facing wall, press up. Kid should jump up.
223
forward_pressed: short was word
224
check_can_guard_see_kid: kid_frame was kid.frame
225
guard_follows_kid_down: parantheses after &&, !tile_...
226
sub_404B: if (tile... was if (!tile...
227
hof_read: .HOF was .SAV
228
	# intro: empty hof is shown
229
do_wait was wrong
230
	# now h/j/u/n work after second esc
231
added do_simple_wait, replaced do_wait with do_simple_wait in play_level_2 and sub_4B16
232
	# h,j,u,n doesn't work
233
	# after pausing, first(second) esc is ignored
234
		# first ESC is read by play_level_2/do_wait/idle,
235
		# second by play_level_2/do_wait/do_paused/idle,
236
		# next are read by play_level_2/play_frame/play_kid_frame/check_died/sub_7981/do_paused/idle
237
anim_guard: short was word
238
FIXED? # Game hangs if kid with sword is too far from guard
239
FIXED: # When looking left and climbing up/down, overlay is drawn at wrong position (level 4 room 17)
240
FIXED? # Hang against wall is positioned wrongly.
241
FIXED: # level 6: shadow doesn't step onto button
242
# Immediate shift-L on level 1: room = -1 (from collision)
243
	worked around
244
	also present in original, see: dos-debug-FF.txt
245
FIXED: # kid falls into spike in demo
246
FIXED: # kid/guard has no sword when looking right ; hflip does something weird with sword image
247
	# most images use SDL_SRCCOLORKEY, sword uses SDL_SRCALPHA
248
	# when the skeleton falls into other room, it disappears ... or just becomes invisible?
249
in_wall: short was word
250
distance_to_edge: short was word
251
sub_80A3: short was word
252
load_frame: short was word
253
check_action: short was word
254
do_wait and do_simple_wait: while was do-while
255
	# when un-pausing with arrow (or home/pageup), arrow is not noticed (annoying with chompers) + hangs until key is released
256
control_with_sword: removed else
257
	# Level 2 room 4, level 1 room 3: Guard won't attack if kid is too far (but sees him!) except if kid turns his back to the guard
258
FIXED: # intro: Jaffar disappears after turning
259
bumped_floor: return; was missing
260
start_game: missing else
261
check_action: ###
262
	bad:
263
	if (action == actions_6_hang_straight ||
264
		(action == actions_5_bumped && frame == 109)
265
	) {
266
		// nothing
267
	good:
268
	if (action == actions_6_hang_straight ||
269
		action == actions_5_bumped
270
	) {
271
		if (frame == 109) {
272
			check_on_floor();
273
		}
274
FIXED: # Level 1 room 12, Level 7 room 9, Level 8 room 7, level 4 room 4, level 15 room 4: can jump/fall through single wall; step to wall and press up/down ; up fixed
275
	# in_wall: get_tile_infrontof_char, curr_col is inside wall! -> infrontof is the other side of the wall!
276
	# start_fall: row is immediately changed to 2
277
	# if gate (level 4): play_level_2/play_frame/play_kid_frame/check_bumped/check_bumped_look_left/is_obstacle_at_col/is_obstacle/can_bump_into_gate
278
	# if wall (level 1): play_level_2/play_frame/play_kid_frame/check_bumped/check_bumped_look_left/is_obstacle_at_col/is_obstacle
279
FIXED: # level 2 room 5: When run-jumping to wall, kid is not hurt
280
FIXED: # level 1 room 1: after run-jumping to gate, kid falls too early (related to wall-jump?)
281
draw_hurt_splash: missing obj_dx_forward(5);
282
	# when hurt by fall, hurt splash appears at wrong xpos (6 to the left)
283
compare_curr_objs:
284
	bad:
285
	if (objtable[obj_index1].obj_type != 0x80 ||
286
		objtable[obj_index2].obj_type != 0x80
287
	) {
288
		if (objtable[obj_index1].y >= objtable[obj_index2].y) return 0;
289
	} else {
290
		if (objtable[obj_index1].y <= objtable[obj_index2].y) return 0;
291
	}
292
	good:
293
	if (objtable[obj_index1].obj_type == 0x80 &&
294
		objtable[obj_index2].obj_type == 0x80
295
	) {
296
		return (objtable[obj_index1].y < objtable[obj_index2].y);
297
	} else {
298
		return (objtable[obj_index1].y > objtable[obj_index2].y);
299
	}
300
	# kid appears in front of dead guards
301
show_time: leveldoor_open == 0 was !=
302
	# 1 HP does not blink on level 13
303
animate_sword: if (curr_modifier == 0) { was if (curr_modifier) {
304
run_jump: (word)var_8 < (word)-8 was var_8 < -8
305
FIXED: # shadow is invisible (wrong pos) on level 12 if kid enters from right ... until kid pokes shadow
306
# INVALID: shadow dies from one hit?
307
Some HPs [after third] disappear when going down.
308
	method_1_blit_rect used SDL_FillRect
309
Gate does not stay open if a guard is killed on an open button.
310
	died_on_button: missing tile = tiles_14_debris;
311
bug_chomper.PNG
312
	caused by FIX_BIGPILLAR_CLIMB
313
bug_climb.PNG
314
	caused by FIX_BIGPILLAR_CLIMB
315
--- after 20140524 ---
316
end_sequence: hof_index <= hof_count was hof_index < hof_count
317
	FIXED?: # at the end of the game, no hall of fame?
318
# Crashes instead of demo level. (after HOF) even in 20140524
319
	release_title_images: free_near(xlat_title_40);
320
	warning: Invalid Address specified to RtlFreeHeap ( 00A30000, 00DE23D8 )
321
	added some NULL checks
322
	init_game(): free_screeninfo() hangs (?)
323
	after loading kid.dat
324
	added some more =NULL statements.
325
	FIXED?
326
	why was this not a problem before?
327
FIXED: # "Press button..." does not blink correctly.
328
FIXED: # HOF is not saved after adding myself.
329
	PRINCE.HOF (and PRINCE.SAV) is read-only!
330
	hof_write: missing ,0600
331
FIXED: # Start level 14, press H until the ending is shown. HOF shows 60:xx instead of 59:xx.
332
	show_hof: missing - 1
333
FIXED: get_trob_right_above_pos_in_drawn_room, inside if(trob.room == room_B) : missing else{tile_pos = 30;}
334
draw_game_frame: var_2 = word_20C6A / 12; -> var_2 = word_20C6A % 12;
335
--- 2014-07-06
336
FIXED: # fading bugs
337
	* set_gr_mode: 24bit vs. 32bit
338
	* make_offscreen_buffer: RGB vs. BGR
339
	* fade_out_frame: missing "++off_pixel_ptr;"
340
FIXED: # Fading of cutscenes is too slow... unless I move the cursor over the window.
341
	proc_cutscene_frame: where to put idle() ?
342
FIXED?: # Before the first frame of the level, the last frame (of the previous level or the cutscene) is drawn.
343
	# draw_level_first() -> redraw_screen(0) -> remove_flash()
344
--- 2014-07-22
345
FIXED: # Game is too fast for a short time after switching rooms. (Or restarting the level)
346
	# was caused by the "COMPAT_TIMER"
347
FIXED: Cutscenes fade too fast without COMPAT_TIMER
348
	# Changed 0 to 1 in the calls to make_pal_buffer_fade{in,out} (seg001.c)
349
FIXED: Andrew: "New rooms take quite some time to be drawn, with the screen being blank in-between"
350
	# SDL_UpdateRect was called after each drawing. -- It is needed only if the target is the on-screen surface.
351
FIXED: If the mouse cursor leaves/enters the window, the game does as if the pressed keys were released.
352
	# This should happen only if the game loses keyboard focus.
353
	# Perhaps the game should also be paused in this case?
354
	# idle(): There are many types of SDL_ACTIVEEVENT, losing SDL_APPINPUTFOCUS if just one of them.
355
--- 2014-07-23
356
FIXED: Keys did not repeat themselves.
357
	Needed for keys like "+" and "-".
358
	Using SDL_EnableKeyRepeat().
359
FIXED: # Starting a new game after winning a previous one makes all texts in the game blue instead of white.
360
	draw_text_cursor(): added textstate.textcolor = 15;
361
--- 2014-07-24
362
FIXED: # When the screen is flashing, there may be black rectangles around the moving objects.
363
	Move the flashing after the redraws at two places:
364
	1. play_level_2() in seg003.c (through flash_if_hurt())
365
	2. proc_cutscene_frame() in seg001.c
366
FIXED: start_fall(): distance_to_edge_weight() <= 7 was 6 (under seq_id = 82;)
367
FIXED: # Can't do level 7 trick: In room 24 bump into the right wall. Turn left, run left and immediately jump.
368
	play_frame -> play_kid_frame -> check_bumped -> check_bumped_look_left -> bumped -> bumped_floor -> bumped_sound
369
	bumped_floor():
370
	bad: if (char_.sword != 2 && y_land[char_.curr_row + 1] - char_.y >= 15) {
371
	good: if (char_.sword != 2 && (word)(y_land[char_.curr_row + 1] - char_.y) >= (word)15) {
372
FIXED: check_hang():
373
	bad: y_land[char_.curr_row + 1] <= char_.y + 25
374
	good: (word)y_land[char_.curr_row + 1] <= (word)(char_.y + 25)
375
FIXED: do_fall():
376
	bad: if (y_land[char_.curr_row + 1] > char_.y) {
377
	good: if ((word)y_land[char_.curr_row + 1] > (word)char_.y) {
378
--- 2014-08-04
379
FIXED: # Can't interrupt fading of title screen.
380
	The problem is that fade_in_2 does a zero-length wait, and expects keypresses to happen then.
381
	fade_{in/out}_frame does a "simple wait", that is, keypresses are not processed then.
382
	So I changed that to a "regular" wait.
383
FIXED: # (Micro Palace, level 12) If kid is on the very left (in bottom row), then shadow is in wrong direction (looking left), and is constantly turning around.
384
	move_2_backward() is called from level12_shadow_anim()
385
	Local variable xdiff might be used uninitialized!
386
	Workaround: initialize xdiff with a big number.
387
	This behavior matches the DOS version but not the Apple II source. (AUTO.S, part around "wait until kid gets close")
388
--- 2014-08-06
389
FIXED: When using DAT files: some images are not loaded. (Example: pillar left, spike left)
390
	load_more_opt_graf(): missing -1
391
FIXED: # (Micro Palace, level 4) After kid enters exit door, chomper bites kid.
392
	set_char_collision(): If current image is NULL then width=height=0. (Older version didn't set width/height in this case.)
393
FIXED: # shadow is partially green when he is looking to the right
394
	hflip(): output surface should have no alpha
395
FIXED: replaced exit with quit at many places
396
FIXED: # When using DAT files: chomper blood is a rectangle.
397
	"Extra" optional images were not set transparent.
398
	method_3_blit_mono(): Added SDL_SetColorKey call.
399
FIXED: # (Prince of Wateria, level 5 room 3) (palace) Empty potion has red bubbles.
400
	draw_tile_anim(): case 0x00: break; -> return;
401
--- 2014-08-07
402
FIXED: parry(): char_charid == charid_0_kid -> char_charid != charid_0_kid
403
FIXED: parry(): var_6 = 1; } -> var_6 = 1; } else
404
FIXED: parry(): back_with_sword(); (the first) -> back_with_sword(); return;
405
--- 2014-08-08
406
FIXED: Made compatible with 64-bit.
407
	I replaced occurences of "short" and "long" with "Uint16" and "Uint32".
408
	To be extra sure, I also added some compile time asserts about the sizes of all types that are used in the DAT files.
409
--- 2014-08-10
410
FIXED: If color 0 of a palette was not black, then it was not transparent.
411
	For example, in Lost In The Forest ( http://www.popot.org/custom_levels.php?mod=0000082 ).
412
FIXED: PNGs with alpha channel are drawn properly.
413
--- 2014-08-23
414
FIXED: make_loose_fall():
415
-	if (curr_room_modif[curr_tile_pos] <= 0) {
416
+	if ((sbyte)curr_room_modif[curr_tile_pos] <= 0) {
417
FIXED: # When fighting, parry-attack-parry-attack-... sequences stop when the guard attacks.
418
	parry():
419
-	if (opp_frame != 167) return;
420
+	if (char_frame != 167) return;
421
--- 2014-08-24
422
FIXED: prandom(): initialize from current time
423
--- 2014-08-26
424
FIXED: animate_leveldoor(): (seg007.c)
425
-	!(sound_flags & sfDigi) &&
426
+	(sound_flags & sfDigi) &&
427
FIXED: play_speaker_sound(): (seg009.c)
428
+	speaker_sound_stop();
429
--- 2014-08-28
430
FIXED: Under Linux, the game hanged randomly, because the main timer sometimes didn't generate its event.
431
	timer_callback() and sound_callback(): (in seg009.c)
432
		Remove and NULL the timer handle before generating the event.
433
	This also prevents the "SDL_RemoveTimer:" errors.
434
FIXED: Removed the "Would play sound", "length =", "set_char_collision" and "Loading chtab" messages.
435
	Those were annoying and possibly slowed the game down.
436
FIXED: # Level 12: If I enter the last room while the music is still "playing", then the game does not advance to level 13.
437
	# Tried to load cutscene for level 26, not in 0..15
438
	play_frame(): (in seg000.c)
439
+			stop_sounds();
440
FIXED: # Level 12->13 transition should not restore full HP or show level number.
441
	play_frame(): (in seg000.c)
442
+			seamless = 1;
443
FIXED: # Displaying text is visibly slow on some systems.
444
	method_1_blit_rect(), method_5_rect(), blit_xor(), method_6_blit_img_to_scr(): (in seg009.c)
445
	Update only the affected area instead of the whole screen.
446
-		SDL_UpdateRect(onscreen_surface_, 0, 0, 0, 0);
447
+		SDL_UpdateRects(onscreen_surface_, 1, &dest_rect);
448
--- 2014-09-05
449
FIXED: Pressing "K" on a skeleton crashes the game.
450
	add_midtable(): (in seg008.c)
451
+	if (id > chtab_addrs[chtab_id]->n_images) {
452
+		printf("add_midtable: Tried to use image %d of chtab %d, not in 1..%d\n", id, chtab_id, chtab_addrs[chtab_id]->n_images);
453
+		return 0;
454
+	}
455
FIXED: Added "return 0;" after the "*Table Overflow" messages.
456
--- 2014-09-22
457
FIXED: blit_xor(): (in seg009.c)
458
-		SDL_UpdateRects(onscreen_surface_, 1, &dest_rect);
459
+		SDL_UpdateRects(onscreen_surface_, 1, /*&*/dest_rect);
460
FIXED: process_key(): (in seg000.c)
461
-			turn_sound_on_off(!is_sound_on * 15);
462
+			turn_sound_on_off((!is_sound_on) * 15);
463
FIXED: load_opt_sounds(): (in seg000.c)
464
-		digi_dat = open_dat("DIGISND21.DAT", 0);
465
+		digi_dat = open_dat("DIGISND2.DAT", 0);
466
FIXED: # Digi sounds hang the game for 1 second (or permanently).
467
	Instead of opening and closing the audio device for each sound, keep it open (with a constant rate -> resampling is needed).
468
FIXED: # On windows, digi sounds are played with the wrong timing. You can hear this best when the kid is continuously running, or when a gate is opening/closing.
469
	Sound buffer length is 5512 instead of the 512 I set.
470
	With 22050 Hz samplerate, this means 0.25 seconds instead of 0.023 s.
471
	On Linux, the length is 256, and the timing is good.
472
	Fixed by replacing SDL.dll (1.14) with the newest version (1.2.15).
473
--- 2014-09-23
474
FIXED: The game quits in the intro, when Jaffar opens the door.
475
	play_digi_sound(): (in seg009.c) SDL_BuildAudioCVT() might also return 0 on success, but this is not documented in the docs of SDL 1.2.
476
--- 2014-09-25
477
FIXED: Index overflow in get_tile_div_mod() is kid is far off left.
478
	FIXED: # When doing the level 5 trick (backing through the gate), the kid appears in the room to the *right* instead of left.
479
	FIXED: # Level 5: If you back out from the room where the guard is originally (but the screen is not switched), the kid might fall through the floor at the level door.
480
--- 2014-10-06
481
FIXED: check_shadow(): (in seg002.c)
482
-	if (leveldoor_open == 0x4D) {
483
+	if (leveldoor_open != 0x4D) {
484
--- 2014-10-11
485
FIXED: Made the game compatible with Mac OS X, based on the suggestions by StaticReturn (from the Princed forum).
486
	(See also MAC_CHANGES.txt)
487
	- Renamed wait() to pop_wait().
488
	- do_trigger_list:
489
-	while (doorlink1_ad[index] != -1) { // these can't be equal!
490
+	while (1) {
491
	- Added typecasts to pointers (at malloc() calls for example).
492
FIXED: Fixed most things that caused compiler warnings.
493
	- Changed some pointers from void* to a better type.
494
	- Removed some unused variables.
495
	- Removed some unused parameters.
496
	- Changed the numbers in tile and frame tables from unsigned to signed where this was needed.
497
	- Added const to some parameters.
498
CHANGE: Now cheats are disabled by default unless the game is compiled in debug mode.
499
CHANGE: Disambiguated tilepos and tiletype.
500
--- 2014-10-27
501
CHANGE: Added a font inside the exe. (hc_font_data[])
502
CHANGE: Changed project type to GUI. This means that the (empty) console window won't appear under Windows.
503
CHANGE: Changed project's name to "SDLPoP" (was "port").
504
CHANGE: Changed the title to "Prince of Persia (SDLPoP) v1.11" (it used to say "... (SDL) v#.##")
505
--- 2014-12-03
506
FIXED: When doing Trick 95, the kid might bounce back from the wall a bit.
507
start_fall(): (seg006.c)
508
	seqtbl_offset_char(104); // start fall (when?)
509
+	play_seq();
510
--- 2014-12-20
511
FIXED: Don't quit if there is no sound device available.
512
	Instead, just disable digi sound.
513
	This can happen, for example, on a Raspberry PI emulator (QEMU).
514
init_digi():
515
-	quit(1);
516
+	digi_unavailable = 1;
517
+	return;
518
play_digi_sound():
519
+	if (digi_unavailable) return;
520
--- 2015-02-16
521
FIXED: Ctrl-S did not turn off mixer sounds.
522
play_chunk_sound():
523
+	//if (!is_sound_on) return;
524
	Note: this is not good for sound-based timing!
525
FIXED: Ctrl-S did not stop currently playing sounds.
526
turn_sound_on_off():
527
+	//if (!is_sound_on) stop_sounds();
528
	Note: this is not good for sound-based timing!
529
+	init_digi();
530
+	if (digi_unavailable) return;
531
+	Mix_Volume(-1, is_sound_on ? MIX_MAX_VOLUME : 0);
532
Note: If digi is unavailable, then load_sound will load the speaker sounds, so sound-based timing will still work.
533
FIXED: # If the game is in full screen, and I switch away (alt-tab) and back, most of the screen will be black, until it is redrawn.
534
idle():
535
+	if ((event.active.state & SDL_APPACTIVE) && event.active.gain == 1) {
536
+		SDL_UpdateRect(onscreen_surface_,0,0,0,0);
537
+	}
538
Note: In this case, DOSBox switches to windowed mode.
539
 
540
# GNU/Linux: Full screen resolution is 640*480 instead of 320*200.
541
	Also on Windows, depending on video card.
542
# GNU/Linux: After quitting (from full screen), the resolution is not restored, and an error message appears on the console. (X-error.txt)
543
	It seems that this bug disappeared, even from the old versions. It was probably caused by something outside the game.
544
# "Shift" of Shift-L interrupts cutscene too soon.
545
# Keys other than Shift won't interrupt fading of cutscene.
546
 
547
Not fixed yet:
548
==============
549
 
550
# game speed is a bit off (delay is longer than it should be) -- you can see this best with chompers
551
# Sometimes when jumping right to room 0: bounces back
552
	# also present in original
553
# shadow is invisible on level 12 if kid enters from left, or starts in the left half ... until kid pokes shadow
554
	Wrong ypos, you can see that when kid unites with shadow.
555
	# "enters from left": could not reproduce
556
	# "starts in the left half": also present in original
557
 
558
Leaks:
559
======
560
 
561
# LEAK: Going to new level allocates memory (~ 500 kB) that is never freed.
562
	free_chtab(): free_far -> SDL_FreeSurface
563
# LEAK: Switching between playing and intro allocates memory that is never freed. (play->intro: ~ 500 kB, intro->play: ~ 1 MB)
564
	clear_screen_and_sounds(): not freeing
565
# LEAK: still leaking
566
	intro->play: ~ 1 MB
567
	play->intro: ~ 340 kB,
568
offscreen_info = 192 kB, it is never freed!
569
Fixed
570
# LEAK: still leaking
571
	intro->play: ~ 772 kB
572
	play->intro: ~ 196 kB
573
	Level 1->2->...->14->1 : ~ 80 kB
574
--- 2015-02-13
575
FIXED: release_title_images is never called!
576
in start_game() added:
577
+	release_title_images();
578
+	free_optsnd_chtab();
579
Title: 44844 K
580
Level 1: 28184 K
581
Title: 45440 K
582
Level 1: 28188 K
583
Title: 45448 K
584
Level 1: 28204 K
585
45440-44844 = 596
586
45448-45440 = 8
587
28188-28184 = 4
588
28204-28188 = 16
589
Level 1->2->...->14->1 : 28188 -> 28296 -> 28304 ~ 108 or 8
590
 
591
Formerly not implemented:
592
=========================
593
 
594
DONE: # Coloring monochrome images (bubbles, chomper blood, story texts, gate top mask) and black blitter
595
	FIXED: # Top of gate looks weird (mask is drawn)
596
DONE: # Cutscenes
597
DONE: # upside-down
598
	FIXED # hangs / bad clip if kid drinks upside-down potion
599
DONE: # blitter 9
600
	FIXED # guard HP does not disappear if guard dies
601
DONE: # Flashing
602
DONE: # xor blitter (shadow needs this)
603
DONE: # Guard palettes (can't see guard's HP without this)
604
DONE: Full screen mode: use the "full" command line option.
605
--- after 20140524 ---
606
DONE: Made compatible with GNU/Linux. (2014 May 29)
607
DONE: # Texts (needs monochrome) (2014 June 2)
608
DONE: # Fading (almost perfect) (2014 July 6)
609
--- 2014-07-22
610
DONE: # Hide cursor in fullscreen.
611
--- 2014-08-01
612
DONE: # Support LEVELS.DAT
613
--- 2014-08-06
614
DONE: # Use .DAT files
615
	GNU/Linux: The names of the DAT files must be all-uppercase.
616
--- 2014-08-24
617
DONE: # Sound timing (slow-fall and intro needs this)
618
DONE: # Background color of texts in intro and ending
619
--- 2014-09-22
620
DONE: # Digi sounds (only from DAT)
621
--- 2014-09-28
622
DONE: Added version number to the window title.
623
--- 2015-02-13
624
DONE: Use mixer.
625
DONE: Added support for music.
626
--- 2015-02-16
627
DONE: Toggle fullscreen with alt-enter.
628
 
629
Not (yet) implemented:
630
======================
631
 
632
# Digi sounds from wav files
633
# speaker and midi sounds
634
# stretch image to 2x, 3x (you can use fullscreen instead)