summaryrefslogtreecommitdiff
path: root/apps/plugins/xrick/e_box.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/xrick/e_box.c')
-rw-r--r--apps/plugins/xrick/e_box.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/apps/plugins/xrick/e_box.c b/apps/plugins/xrick/e_box.c
new file mode 100644
index 0000000000..25884b1a12
--- /dev/null
+++ b/apps/plugins/xrick/e_box.c
@@ -0,0 +1,109 @@
1/*
2 * xrick/e_box.c
3 *
4 * Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net).
5 * Copyright (C) 2008-2014 Pierluigi Vicinanza.
6 * All rights reserved.
7 *
8 * The use and distribution terms for this software are contained in the file
9 * named README, which can be found in the root of this distribution. By
10 * using this software in any fashion, you are agreeing to be bound by the
11 * terms of this license.
12 *
13 * You must not remove this notice, or any other, from this software.
14 */
15
16#include "xrick/e_box.h"
17
18#include "xrick/game.h"
19#include "xrick/ents.h"
20#include "xrick/e_bullet.h"
21#include "xrick/e_bomb.h"
22#include "xrick/e_rick.h"
23#include "xrick/maps.h"
24#include "xrick/util.h"
25
26/*
27 * FIXME this is because the same structure is used
28 * for all entities. Need to replace this w/ an inheritance
29 * solution.
30 */
31#define cnt c1
32
33/*
34 * Constants
35 */
36#define SEQ_INIT 0x0A
37
38/*
39 * Prototypes
40 */
41static void explode(U8);
42
43/*
44 * Entity action
45 *
46 * ASM 245A
47 */
48void
49e_box_action(U8 e)
50{
51 static U8 sp[] = {0x24, 0x25, 0x26, 0x27, 0x28}; /* explosion sprites sequence */
52
53 if (ent_ents[e].n & ENT_LETHAL) {
54 /*
55 * box is lethal i.e. exploding
56 * play sprites sequence then stop
57 */
58 ent_ents[e].sprite = sp[ent_ents[e].cnt >> 1];
59 if (--ent_ents[e].cnt == 0) {
60 ent_ents[e].n = 0;
61 map_marks[ent_ents[e].mark].ent |= MAP_MARK_NACT;
62 }
63 } else {
64 /*
65 * not lethal: check to see if triggered
66 */
67 if (e_rick_boxtest(e)) {
68 /* rick: collect bombs or bullets and stop */
69#ifdef ENABLE_SOUND
70 syssnd_play(soundBox, 1);
71#endif
72 if (ent_ents[e].n == 0x10)
73 game_bombs = GAME_BOMBS_INIT;
74 else /* 0x11 */
75 game_bullets = GAME_BULLETS_INIT;
76 ent_ents[e].n = 0;
77 map_marks[ent_ents[e].mark].ent |= MAP_MARK_NACT;
78 }
79 else if (e_rick_state_test(E_RICK_STSTOP) &&
80 u_fboxtest(e, e_rick_stop_x, e_rick_stop_y)) {
81 /* rick's stick: explode */
82 explode(e);
83 }
84 else if (E_BULLET_ENT.n && u_fboxtest(e, e_bullet_xc, e_bullet_yc)) {
85 /* bullet: explode (and stop bullet) */
86 E_BULLET_ENT.n = 0;
87 explode(e);
88 }
89 else if (e_bomb_lethal && e_bomb_hit(e)) {
90 /* bomb: explode */
91 explode(e);
92 }
93 }
94}
95
96
97/*
98 * Explode when
99 */
100static void explode(U8 e)
101{
102 ent_ents[e].cnt = SEQ_INIT;
103 ent_ents[e].n |= ENT_LETHAL;
104#ifdef ENABLE_SOUND
105 syssnd_play(soundExplode, 1);
106#endif
107}
108
109/* eof */