completely changed event_queue logic
[h2d.git] / events.c
blob27569fa4d01dd8bc42abfc4c63955e255e169ec5
2 bool checkunitsleft(){
3 FOR_EACH_UNIT {
4 if(u->player == player)
5 return(true);
7 return(false);
12 void onspace(){
13 player++; if(player==3) player=0;
16 cw++;
17 if(cw == &worlds[players_count])
18 cw = &worlds[0];
21 #if 0
22 if(!checkunitsleft()){
23 puts("WINNER!");
24 exit(EXIT_SUCCESS);
26 #endif
28 cw->selunit = NULL;
30 FOR_EACH_UNIT{
31 if(u->player == player){
32 u->mvp = u->type->mvp;
33 u->can_attack = true;
37 //select_next_unit();
42 void keys(SDL_Event E){
43 if(cw->mode!=MODE_SELECT) return;
45 switch(E.key.keysym.sym) {
46 case SDLK_ESCAPE:
47 case SDLK_q:
48 done = true;
49 break;
50 case SDLK_UP: map_offset.y += 54; break;
51 case SDLK_DOWN: map_offset.y -= 54; break;
52 case SDLK_LEFT: map_offset.x += 72; break;
53 case SDLK_RIGHT: map_offset.x -= 72; break;
54 case SDLK_SPACE: onspace(); break;
55 case SDLK_r: change_tile(cw->selhex);break;
56 case SDLK_n: select_next_unit(); break;
57 default: break;
63 void mouseclick(SDL_Event E){
64 if(cw->mode!=MODE_SELECT) return;
66 mcrd m = scr2map((scrd){E.button.x, E.button.y});
67 unit * u = mp(m)->unit;
69 if(u && u->player == player){
70 select_unit(m);
71 }else if(cw->selunit){
72 if( !u || (u && (is_invis(u)||!mp(m)->fog)) ){
73 get_path(m);
74 int d[100] = {0, EVENT_MOVE, cw->selunit->id};
76 int len=3;
77 mnode * t = (mnode*)(l_first(cw->path));
78 while(l_next(t)){
79 unit * u = mp( ((mnode*)l_next(t))->crd )->unit;
80 if(u && u->player!=cw->selunit->player)
81 break; // ambush!
82 mnode * n = (mnode*)l_next(t);
83 d[len] = mcrd2index(t->crd, n->crd);
84 t = (mnode*)l_next(t);
85 len++;
87 d[0] = len;
88 //for(int i=0; i<10; i++) printf("%i ", d[i]); puts("");
89 add_event(d);
91 //ambush
93 mnode * t = (mnode*)l_first(cw->path);
94 while(t){
95 unit * u = mp(t->crd)->unit ;
96 if(u && u->player!=player){
97 int dir = mcrd2index(t->crd, ((mnode*)l_prev(t))->crd);
98 int data[5] = {5, EVENT_MELEE, u->id, dir, 1};
99 add_event(data);
100 break;
102 t = (mnode*)l_next(t);
105 return;
108 if(u && u->player!=player && cw->selunit
109 && cw->selunit->can_attack
110 && !is_invis(u) && mp(m)->fog > 0){
111 feature * rng = find_feature(cw->selunit, FEATURE_RNG);
112 if(rng){
113 if(mdist(cw->selunit->mcrd, m) <= rng->data.rng.range){
114 int data[5] = {5, EVENT_RANGE, cw->selunit->id, mp(m)->unit->id, 2};
115 add_event(data);
117 }else{
118 if(mdist(cw->selunit->mcrd, m) <= 1){
120 /*тут добавить огонь поддержки*/
122 for(int i=0; i<6; i++){
123 mcrd n = neib(m, i);
124 if( mp(n)->unit && mp(n)->unit->player == mp(m)->unit->player ){
125 feature * rng = find_feature(mp(n)->unit, FEATURE_RNG);
126 if(rng){
127 int data[5] = {5, EVENT_RANGE, mp(n)->unit->id, cw->selunit->id, 2};
128 add_event(data);
134 int dir = mcrd2index(cw->selunit->mcrd, mp(m)->unit->mcrd);
135 int data[5] = {5, EVENT_MELEE, cw->selunit->id, dir, 1};
136 add_event(data);
138 /*тут добавить проверку на то, что оппонент выживет*/
140 if(1){
141 int dir2 = mcrd2index(mp(m)->unit->mcrd, cw->selunit->mcrd);
142 int data2[5] = {5, EVENT_MELEE, mp(m)->unit->id, dir2, 1};
143 add_event(data2);
146 /*тут добавить проверку на необходимость отступления-бегства*/
147 // и направление нужно выбирать в цикле, а не так как сейчас
148 if(1){
149 int data3[4] = {4, EVENT_MOVE, mp(m)->unit->id, dir};
150 add_event(data3);
160 void mousemove(SDL_Event E){
161 cw->selhex = scr2map((scrd){E.button.x, E.button.y});
166 void events() {
167 SDL_Event E;
168 while(SDL_PollEvent(&E)){
169 if(E.type==SDL_QUIT) done = true;
170 if(E.type==SDL_KEYUP) keys(E);
171 if(E.type==SDL_MOUSEBUTTONDOWN) mouseclick(E);
172 if(E.type==SDL_MOUSEMOTION) mousemove(E);
173 if(E.type==SDL_VIDEORESIZE){
174 Uint32 flags = SDL_SWSURFACE | SDL_RESIZABLE;
175 screen = SDL_SetVideoMode(E.resize.w,
176 E.resize.h, 32, flags);