summaryrefslogtreecommitdiff
path: root/src/player.c
blob: ed17b78a545d3a077dc8a467d1a05febfa5d552e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#include "player.h"

#include "globals.h"
#include <math.h>

void tt_player_draw()
{
    int      i, j;
    tt_room *r = ttplayer.room;
    for (i = 0; i != TT_ROOM_H; ++i) {
        for (j = 0; j != TT_ROOM_W; ++j) {
            SDL_Rect  d = { 14 + j * 32, 14 + i * 32, 32, 32 };
            SDL_Rect *f = r->floor[i][j];
            tt_body * w = r->walls[i][j];
            if (f) SDL_RenderCopy(ttrdr, tttxr, f, &d);
            if (w) {
                SDL_Rect s = {
                    (w->txrcol * w->anim + w->rem / w->rate % w->anim) * 16,
                    w->txrrow * 16, 16, 16
                };
                SDL_RenderCopy(ttrdr, tttxr, &s, &d);
            }
        }
    }

    if (ttplayer.lenin_zhiv) {
        {
            SDL_Rect src = { 32 + 32 * (ttplayer.lenin_rem / 200 % 2),
                             16 * 12 + 4, 32, 38 };
            SDL_Rect dst = { 14 + ttplayer.lenin_pos,
                             14 + 32 + 96 - 8 - 38 * 2, 64, 38 * 2 };
            SDL_RenderCopy(ttrdr, tttxr, &src, &dst);
        }
        {
            SDL_Rect src = { 96 + 64 * (ttplayer.lenin_rem / 200 % 2),
                             16 * 12, 64, 48 };
            SDL_Rect dst = { 14 + ttplayer.lenin_pos - 32, 110, 128, 96 };
            SDL_RenderCopy(ttrdr, tttxr, &src, &dst);
        }
    }

    for (i = 0; i != r->bodies_count; ++i) {
        tt_body *b = r->bodies + i;
        SDL_Rect s = { (b->txrcol * b->anim + b->rem / b->rate % b->anim) *
                           16,
                       b->txrrow * 16, 16, 16 };
        if (b->isdoor) {
            SDL_Rect d = { 14 + b->x, 14 + b->y, 32, 32 };
            SDL_RenderCopy(ttrdr, tttxr, &s, &d);
        } else {
            SDL_Rect d = { 14 + b->x, 14 + b->y, 32, 32 };
            SDL_RenderCopy(ttrdr, tttxr, &s, &d);
        }
        if (b->msg) {
            SDL_Color    c   = { 255, 255, 255, 255 };
            SDL_Surface *s   = TTF_RenderText_Blended(ttfont, b->msg, c);
            SDL_Texture *t   = SDL_CreateTextureFromSurface(ttrdr, s);
            SDL_Rect     dst = { 50 + b->x, 20 + b->y, s->w, s->h };
            SDL_RenderCopy(ttrdr, t, 0, &dst);
            SDL_DestroyTexture(t);
            SDL_FreeSurface(s);
        }
    }

    SDL_Rect d   = { 14 + ttplayer.x, 14 + ttplayer.y, 32, 32 };
    int      dir = 0;
    if (ttplayer.xwalk == 1) dir = 6;
    else if (ttplayer.xwalk == -1)
        dir = 2;
    else if (ttplayer.ywalk == -1)
        dir = 4;
    SDL_Rect s = { 16 * (8 * ttplayer.variant + dir +
                         (ttplayer.rem / 100 % 2)),
                   16 * 6, 16, 16 };
    SDL_RenderCopy(ttrdr, tttxr, &s, &d);

    if (ttplayer.until_gulag > 0) {
        double r = ttplayer.until_gulag / 10;
        double f = (double)(ttplayer.until_gulag) / 3000 * 2 *
                   3.14159265358979323846;
        SDL_Rect s = { 0, 16 * 12, 32, 48 };
        SDL_Rect d = { ttplayer.x - 16 + r * cos(f),
                       ttplayer.y - 32 + r * sin(f), 64, 96 };
        SDL_RenderCopy(ttrdr, tttxr, &s, &d);
    }

    {
        SDL_BlendMode bm;
        SDL_GetTextureBlendMode(tttxr, &bm);
        SDL_SetTextureBlendMode(tttxr, SDL_BLENDMODE_ADD);
        SDL_SetTextureAlphaMod(tttxr, 64);
        SDL_SetRenderTarget(ttrdr, lighttxr);
        SDL_SetRenderDrawColor(ttrdr, 192, 192, 192, 255);
        SDL_RenderClear(ttrdr);
        int i;
        for (i = 0; i != r->bodies_count; ++i) {
            tt_body *b = r->bodies + i;
            if ((7 == b->txrrow && b->txrcol <= 7) || b->txrrow == 11) {
                SDL_Rect src = { 16 * 14, 16 * 12, 32, 32 };
                SDL_Rect d   = { b->x - 16, b->y - 16, 96, 96 };
                SDL_SetTextureColorMod(tttxr, 255, 255, 255);
                SDL_RenderCopy(ttrdr, tttxr, &src, &d);
            }
        }
        SDL_SetTextureColorMod(tttxr, 255, 255, 255);
        SDL_SetTextureAlphaMod(tttxr, 255);
        SDL_SetRenderTarget(ttrdr, 0);
        SDL_Rect dst = { 0, 0, 950, 540 };
        SDL_RenderCopy(ttrdr, lighttxr, 0, &dst);
        SDL_SetTextureBlendMode(tttxr, bm);
        SDL_SetRenderDrawColor(ttrdr, 0, 0, 0, 255);
    }

    {
        SDL_Rect src = { 0, 16 * 11, 16, 16 };
        SDL_Rect d   = { 20 + TT_ROOM_W * 32 + 32, 12 + 32, 64, 64 };
        SDL_RenderCopy(ttrdr, tttxr, &src, &d);
        int count  = ttplayer.keys[0];
        int digits = 1;
        while (count / 10) {
            ++digits;
            count /= 10;
        }
        char *text = malloc(3 + digits);
        text[0]    = 'x';
        text[1]    = ' ';
        int i;
        count = ttplayer.keys[0];
        for (i = digits + 1; i != 1; --i) {
            text[i] = count % 10 + '0';
            count /= 10;
        }
        text[digits + 2] = 0;
        SDL_Color    c   = { 255, 255, 255, 255 };
        SDL_Surface *s   = TTF_RenderText_Blended(ttfont, text, c);
        SDL_Texture *t   = SDL_CreateTextureFromSurface(ttrdr, s);
        SDL_Rect     dst = { 50 + 32 * TT_ROOM_W + 64, 20 + 32, s->w * 2,
                         s->h * 2 };
        SDL_RenderCopy(ttrdr, t, 0, &dst);
        SDL_DestroyTexture(t);
        SDL_FreeSurface(s);
    }
    {
        SDL_Rect src = { 16, 16 * 11, 16, 16 };
        SDL_Rect d   = { 20 + TT_ROOM_W * 32 + 32, 12 + 96, 64, 64 };
        SDL_RenderCopy(ttrdr, tttxr, &src, &d);
        int count  = ttplayer.keys[1];
        int digits = 1;
        while (count / 10) {
            ++digits;
            count /= 10;
        }
        char *text = malloc(3 + digits);
        text[0]    = 'x';
        text[1]    = ' ';
        int i;
        count = ttplayer.keys[1];
        for (i = digits + 1; i != 1; --i) {
            text[i] = count % 10 + '0';
            count /= 10;
        }
        text[digits + 2] = 0;
        SDL_Color    c   = { 255, 255, 255, 255 };
        SDL_Surface *s   = TTF_RenderText_Blended(ttfont, text, c);
        SDL_Texture *t   = SDL_CreateTextureFromSurface(ttrdr, s);
        SDL_Rect     dst = { 50 + 32 * TT_ROOM_W + 64, 20 + 96, s->w * 2,
                         s->h * 2 };
        SDL_RenderCopy(ttrdr, t, 0, &dst);
        SDL_DestroyTexture(t);
        SDL_FreeSurface(s);
    }
    {
        int count  = ttplayer.money;
        int digits = 1;
        while (count / 10) {
            ++digits;
            count /= 10;
        }
        char *text = malloc(4 + digits);
        text[0]    = '$';
        text[1]    = ' ';
        text[2]    = ttplayer.money < 0 ? '-' : ' ';
        int i;
        count = ttplayer.money * (ttplayer.money < 0 ? -1 : 1);
        for (i = digits + 2; i != 2; --i) {
            text[i] = count % 10 + '0';
            count /= 10;
        }
        text[digits + 3] = 0;
        SDL_Color    c   = { 255, 255, 255, 255 };
        SDL_Surface *s   = TTF_RenderText_Blended(ttfont, text, c);
        SDL_Texture *t   = SDL_CreateTextureFromSurface(ttrdr, s);
        SDL_Rect     dst = { 50 + 32 * TT_ROOM_W + 16, 20 + 96 + 96, s->w * 2,
                         s->h * 2 };
        SDL_RenderCopy(ttrdr, t, 0, &dst);
        SDL_DestroyTexture(t);
        SDL_FreeSurface(s);
    }
    if (ttplayer.lenin_rem) {
        int count  = ttplayer.lenin_rem / 1000;
        int digits = 1;
        while (count / 10) {
            ++digits;
            count /= 10;
        }
        char *text = malloc(7 + digits);
        text[0]    = 'T';
        text[1]    = 'i';
        text[2]    = 'm';
        text[3]    = 'e';
        text[4]    = ':';
        text[5]    = ' ';
        int i;
        count = ttplayer.lenin_rem / 1000;
        for (i = digits + 5; i != 5; --i) {
            text[i] = count % 10 + '0';
            count /= 10;
        }
        text[digits + 6] = 0;
        SDL_Color    c   = { 255, 255, 255, 255 };
        SDL_Surface *s   = TTF_RenderText_Blended(ttfont, text, c);
        SDL_Texture *t   = SDL_CreateTextureFromSurface(ttrdr, s);
        SDL_Rect     dst = { 50 + 32 * TT_ROOM_W + 16, 20 + 96 + 96 + 96,
                         s->w * 2, s->h * 2 };
        SDL_RenderCopy(ttrdr, t, 0, &dst);
        SDL_DestroyTexture(t);
        SDL_FreeSurface(s);
    }
}