예제 #1
0
파일: seg004.c 프로젝트: kees/SDLPoP
// seg004:08C3
void __pascal far check_guard_bumped() {
	short var_2;
	if (
		word_1F950 == 0 &&
		Char.action == actions_1_run_jump &&
		Char.alive < 0 &&
		Char.sword >= sword_2_drawn
	) {
		if (
			get_tile_at_char() == tiles_20_wall ||
			curr_tile2 == tiles_7_doortop_with_floor ||
			(curr_tile2 == tiles_4_gate && can_bump_into_gate()) ||
			(Char.direction >= dir_0_right && (
				get_tile(curr_room, --tile_col, tile_row) == tiles_7_doortop_with_floor ||
				(curr_tile2 == tiles_4_gate && can_bump_into_gate())
			))
		) {
			load_frame_to_obj();
			set_char_collision();
			if (is_obstacle()) {
				var_2 = dist_from_wall_behind(curr_tile2);
				if (var_2 < 0 && var_2 > -13) {
					Char.x = char_dx_forward(-var_2);
					seqtbl_offset_char(65); // pushed to wall with sword (Guard)
					play_seq();
					load_fram_det_col();
				}
			}
		}
	}
}
예제 #2
0
파일: seg004.c 프로젝트: kees/SDLPoP
// seg004:07BF
void __pascal far chomped() {
	curr_room_modif[curr_tilepos] |= 0x80; // put blood
	if (Char.frame != 178 && Char.room == curr_room) {
		Char.x = x_bump[tile_col + 5] + 7;
		Char.x = char_dx_forward(7 - !Char.direction);
		Char.y = y_land[Char.curr_row + 1];
		take_hp(100);
		play_sound(sound_46_chomped); // something chomped
		seqtbl_offset_char(54); // chomped
		play_seq();
	}
}
예제 #3
0
파일: seg004.c 프로젝트: kees/SDLPoP
// seg004:04E4
void __pascal far bumped_fall() {
	short action;
	action = Char.action;
	Char.x = char_dx_forward(-4);
	if (action == actions_4_in_freefall) {
		Char.fall_x = 0;
	} else {
		seqtbl_offset_char(45); // fall after bumped
		play_seq();
	}
	bumped_sound();
}
예제 #4
0
파일: seg002.c 프로젝트: mfn/SDLPoP
// seg002:0BCD
void __pascal far hurt_by_sword() {
	short distance;
	if (Char.alive >= 0) return;
	if (Char.sword != sword_2_drawn) {
		// Being hurt when not in fighting pose means death.
		take_hp(100);
		seqtbl_offset_char(seq_85_stabbed_to_death); // dying (stabbed unarmed)
		loc_4276:
		if (get_tile_behind_char() != 0 ||
			(distance = distance_to_edge_weight()) < 4
		) {
			seqtbl_offset_char(seq_85_stabbed_to_death); // dying (stabbed)
			if (Char.charid != charid_0_kid &&
				Char.direction < dir_0_right && // looking left
				(curr_tile2 == tiles_4_gate || get_tile_at_char() == tiles_4_gate)
			) {
				Char.x = x_bump[tile_col - (curr_tile2 != tiles_4_gate) + 5] + 7;
				Char.x = char_dx_forward(10);
			}
			Char.y = y_land[Char.curr_row + 1];
			Char.fall_y = 0;
		} else {
			Char.x = char_dx_forward(distance - 20);
			load_fram_det_col();
			inc_curr_row();
			seqtbl_offset_char(seq_81_kid_pushed_off_ledge); // Kid/Guard is killed and pushed off the ledge
		}
	} else {
		// You can't hurt skeletons
		if (Char.charid != charid_4_skeleton) {
			if (take_hp(1)) goto loc_4276;
		}
		seqtbl_offset_char(seq_74_hit_by_sword); // being hit with sword
		Char.y = y_land[Char.curr_row + 1];
		Char.fall_y = 0;
	}
	// sound 13: Kid hurt (by sword), sound 12: Guard hurt (by sword)
	play_sound(Char.charid == charid_0_kid ? sound_13_kid_hurt : sound_12_guard_hurt);
	play_seq();
}
예제 #5
0
파일: seg004.c 프로젝트: kees/SDLPoP
// seg004:0520
void __pascal far bumped_floor(sbyte push_direction) {
	short frame;
	short seq_index;
	if (Char.sword != sword_2_drawn && (word)(y_land[Char.curr_row + 1] - Char.y) >= (word)15) {
		bumped_fall();
	} else {
		Char.y = y_land[Char.curr_row + 1];
		if (Char.fall_y >= 22) {
			Char.x = char_dx_forward(-5);
		} else {
			Char.fall_y = 0;
			if (Char.alive) {
				if (Char.sword == sword_2_drawn) {
					if (push_direction == Char.direction) {
						seqtbl_offset_char(65); // pushed forward with sword (Kid)
						play_seq();
						Char.x = char_dx_forward(1);
						return;
					} else {
						seq_index = 64; // pushed back with sword
					}
				} else {
					frame = Char.frame;
					if (frame == 24 || frame == 25 ||
						(frame >= 40 && frame < 43) ||
						(frame >= 102 && frame < 107)
					) {
						seq_index = 46; // bump into wall after run-jump (crouch)
					} else {
						seq_index = 47; // bump into wall
					}
				}
				seqtbl_offset_char(seq_index);
				play_seq();
				bumped_sound();
			}
		}
	}
}
예제 #6
0
파일: seg004.c 프로젝트: Falcury/SDLPoP
// seg004:07BF
void __pascal far chomped() {
	#ifdef FIX_SKELETON_CHOMPER_BLOOD
	if (!(fixes->fix_skeleton_chomper_blood && Char.charid == charid_4_skeleton))
	#endif
		curr_room_modif[curr_tilepos] |= 0x80; // put blood
	if (Char.frame != frame_178_chomped && Char.room == curr_room) {
		Char.x = x_bump[tile_col + 5] + 7;
		Char.x = char_dx_forward(7 - !Char.direction);
		Char.y = y_land[Char.curr_row + 1];
		take_hp(100);
		play_sound(sound_46_chomped); // something chomped
		seqtbl_offset_char(seq_54_chomped); // chomped
		play_seq();
	}
}
예제 #7
0
파일: seg004.c 프로젝트: Falcury/SDLPoP
// seg004:08C3
void __pascal far check_guard_bumped() {
	if (
		Char.action == actions_1_run_jump &&
		Char.alive < 0 &&
		Char.sword >= sword_2_drawn
	) {
		if (

			#ifdef FIX_PUSH_GUARD_INTO_WALL
			// Should also check for a wall BEHIND the guard, instead of only the current tile
			(fixes->fix_push_guard_into_wall && get_tile_behind_char() == tiles_20_wall) ||
			#endif

			get_tile_at_char() == tiles_20_wall ||
			curr_tile2 == tiles_7_doortop_with_floor ||
			(curr_tile2 == tiles_4_gate && can_bump_into_gate()) ||
			(Char.direction >= dir_0_right && (
				get_tile(curr_room, --tile_col, tile_row) == tiles_7_doortop_with_floor ||
				(curr_tile2 == tiles_4_gate && can_bump_into_gate())
			))
		) {
			load_frame_to_obj();
			set_char_collision();
			if (is_obstacle()) {
				short delta_x;
				delta_x = dist_from_wall_behind(curr_tile2);
				if (delta_x < 0 && delta_x > -13) {
					Char.x = char_dx_forward(-delta_x);
					seqtbl_offset_char(seq_65_bump_forward_with_sword); // pushed to wall with sword (Guard)
					play_seq();
					load_fram_det_col();
				}
			}
		}
	}
}