1 /* xsoldier, a shoot 'em up game with "not shooting" bonus
2  * Copyright (C) 1997 Yuusuke HASHIMOTO <s945750@educ.info.kanagawa-u.ac.jp>
3  * Copyright (C) 2002 Oohara Yuuma  <oohara@libra.interq.or.jp>
4  *
5  * This is a copyleft program.  See the file LICENSE for details.
6  */
7 /* $Id: callback.c,v 1.15 2002/04/22 15:20:58 oohara Exp $ */
8 
9 #include <X11/Xlib.h>
10 #include <X11/xpm.h>
11 
12 #include "image.h"
13 #include "xsoldier.h"
14 #include "common.h"
15 #include "extern.h"
16 /* ShotToPoint */
17 #include "enemyshot.h"
18 /* sdl_draw_rect */
19 #include "graphic.h"
20 
21 #include "callback.h"
22 
23 /* action */
24 /* do nothing */
NullAct(ObjData * my)25 DelAtt NullAct(ObjData *my)
26 {
27     return NoneDel;
28 }
29 
30 
31 /* hit */
32 /* nothing can hit me, I am immutable */
NullHit(ObjData * my,ObjData * your)33 DelAtt NullHit(ObjData *my, ObjData *your)
34 {
35     return NoneDel;
36 }
37 
38 /* simply die */
NullDelHit(ObjData * my,ObjData * your)39 DelAtt NullDelHit(ObjData *my, ObjData *your)
40 {
41     return NullDel;
42 }
43 
44 /* die with explosion */
DeleteHit(ObjData * my,ObjData * your)45 DelAtt DeleteHit(ObjData *my, ObjData *your)
46 {
47     NewBomb(my->X,my->Y);
48     return my->EnemyAtt;
49 }
50 
51 /* deal damage, explode if dead */
DamageHit(ObjData * my,ObjData * your)52 DelAtt DamageHit(ObjData *my, ObjData *your)
53 {
54   int temp = your->Attack;
55     if (my->HP < your->Attack)
56       temp = my->HP;
57 
58     my->HP -= temp;
59    player->Rec[0].score += temp;
60     if (my->HP <= 0)
61     {
62       player->Rec[0].score -= 1;
63 	if (manage->Loop > 2)
64 	    ShotToPoint(my->X,my->Y,manage->player[0]->Data.X,manage->player[0]->Data.Y,5);
65 	NewBomb(my->X,my->Y);
66 
67         my->showDamegeTime = 0;
68 	return my->EnemyAtt;
69     }
70     else
71     {
72       my->showDamegeTime = 15;
73       return NoneDel;
74     }
75 
76 }
77 
78 /* same above, but with big explosion */
LargeDamageHit(ObjData * my,ObjData * your)79 DelAtt LargeDamageHit(ObjData *my, ObjData *your)
80 {
81   int temp = your->Attack;
82     if (my->HP < your->Attack)
83       temp = my->HP;
84 
85     my->HP -= temp;
86    player->Rec[0].score += temp;
87 
88     if (my->HP <= 0)
89     {
90       player->Rec[0].score -= 1;
91 	if (manage->Loop > 2)
92 	    ShotToPoint(my->X,my->Y,manage->player[0]->Data.X,manage->player[0]->Data.Y,5);
93 	NewLargeBomb(my->X,my->Y);
94 
95         my->showDamegeTime = 0;
96 	return my->EnemyAtt;
97     }
98     else
99     {
100       my->showDamegeTime = 15;
101       return NoneDel;
102     }
103 
104 }
105 
106 
107 /* display */
NullReal(ObjData * my,GrpData * grp)108 void NullReal(ObjData *my, GrpData *grp)
109 {
110     return;
111 }
112 
113 /* rectangle-drawing function for collision-detection debug */
DrawRec(ObjData * my,GrpData * grp)114 void DrawRec(ObjData *my, GrpData *grp)
115 {
116 #ifdef HAVE_LIBSDL
117   /* use double-standard here to keep the 10 pixel boundary */
118   sdl_draw_rect(my->X-my->HarfW + 10, my->Y-my->HarfH + 10,
119                 my->Width, my->Height);
120 
121 #else /* not HAVE_LIBSDL */
122   /*
123     XFillRectangle(dpy,WorkPixmap,FillGC,my->X-my->HarfW,my->Y-my->HarfH,my->Width,my->Height);
124   */
125     XDrawRectangle(dpy,WorkPixmap,FillGC,my->X-my->HarfW,my->Y-my->HarfH,my->Width,my->Height);
126 #endif /* not HAVE_LIBSDL */
127     return;
128 }
129 
130 /* display pixmap */
DrawImage(ObjData * my,GrpData * grp)131 void DrawImage(ObjData *my, GrpData *grp)
132 {
133     PutImage(grp->image[my->image],my->X - grp->HarfW, my->Y - grp->HarfH);
134 
135     return;
136 }
137