diff options
Diffstat (limited to 'hud')
-rw-r--r-- | hud/hud.c | 788 | ||||
-rw-r--r-- | hud/hud.h | 74 | ||||
-rw-r--r-- | hud/hud_views.c | 380 | ||||
-rw-r--r-- | hud/hud_views.h | 47 |
4 files changed, 1289 insertions, 0 deletions
diff --git a/hud/hud.c b/hud/hud.c new file mode 100644 index 0000000..383cb01 --- /dev/null +++ b/hud/hud.c @@ -0,0 +1,788 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <hud.h> +#include <hud_views.h> + +#include <intersect.h> + +// TODO: make sound module mabye? +#define SOUND_MOUSE_OVER 0 +#define SOUND_MOUSE_CLICK_0 1 +#define SOUND_MOUSE_WHEEL 2 +#define SOUND_SUCCESS 3 + + +// INIT +void init_sel_chassis (graphic_settings *gs, hud_sel *sc, txtd *t, + SDL_Rect back, float start) +{ + sc->start = start; + sc->nav = 0; + sc->rect_back = back; +} + +void init_form_new_unit (graphic_settings *gs, form_new_unit *fnu, txtd *t) { + int w = 290+200+300+20*2+10*4 + 30*3 + 200, h = 145+300+20*2+10*1 + 30*2; + int x = gs->resx/2-w/2, y = gs->resy/2-h/2; + fnu->rect_back = { x, y, w, h }; + + fnu->rect_chassis = { x+20, y+20+145+10+30, 300, 300 }; + fnu->rect_brain = { x+20, y+20+30, 145, 145 }; + fnu->rect_battery = { x+150+25, y+20+30, 145, 145 }; + for (int i=0; i<8; i++) { + fnu->rect_weapons[i] = { x+20+300+10+30, y+20+120*i +30, 200, 110 }; + } + for (int i=0; i<8; i++) { + fnu->rect_armor[i] = { x+20+500+20+30*2, y+20+60*i +30, 150, 50 }; + } + for (int i=0; i<8; i++) { + fnu->rect_augs[i] = { x+20+500+20+160+30*2, y+20+60*i +30, 150, 50 }; + } + + fnu->rect_stats = { x+w-20-200, y+20, 200, h-70 }; + + int width = get_text_width("save", t); + button bdone = { "save", 4, { x+w-4*2-width-20, y+h-4*2-11-20 } }; + fnu->done = bdone; +} + +void init_overlay_game (graphic_settings *gs, overlay_game *og, txtd *t) { + int w = 250, h = gs->resy-20; + og->rect_templates = { 10, gs->resy-10-h, w, h }; + + float wnu = get_text_width("new template", t); + button b = { "new template", 4, { w-wnu-4*2, 20 } }; + og->new_template = b; + + float wst = get_text_width("save templates", t); + button b2 = { "save templates", 4, { w-wst-4*2, gs->resy-20-4*2-10 } }; + og->save_templates = b2; + + int warmy = 250, harmy = gs->resy-20; + og->rect_army = { gs->resx-warmy-10, gs->resy-harmy-10, warmy, harmy }; + button b3 = { "save army", 4, { gs->resx-warmy, gs->resy-20-4*2-10 } }; + og->save_army = b3; + + int wbattle = 400, hbattle = 100; + og->rect_battle = { gs->resx/2-wbattle/2, 10, wbattle, hbattle }; + + float wsb = get_text_width("start battle", t); + button b1 = { "start battle", 4, + { og->rect_battle.x+wbattle-wsb-4*2-5, hbattle-4*2-5 } }; + og->start_battle = b1; + + button b4 = { "host game", 4, + { og->rect_battle.x+5, hbattle-4*2-5 } }; + og->host_game = b4; + + button b5 = { "join game", 4, + { og->rect_battle.x+5, hbattle-4*2-5-25 } }; + og->join_game = b5; +} + +void hud_reset (graphic_settings *gs, hud *h, txtd *t) { + init_form_new_unit(gs, &h->fnu, t); + init_overlay_game(gs, &h->og, t); + SDL_Rect clip = { h->fnu.rect_back.x, h->sc.ref->y, + h->fnu.rect_back.w, 300 }; + float start = h->sc.ref->x - h->fnu.rect_back.x; + init_sel_chassis(gs, &h->sc, t, clip, start); +} + +void hud_init (graphic_settings *gs, hud *h, txtd *t) { + h->fnu.sel = 0; h->fnu.ind = 0; + h->sc.ref = &h->fnu.rect_chassis; + h->og.temp_place = -1; + info_unit_init(&h->fnu.uinfo); + strcpy(h->og.army_listcur, "army"); + strcpy(h->og.playername, ""); + h->nameedit = NULL; + h->og.battle_state = 0; + h->og.edit_playername = 0; + hud_reset(gs, h, t); +} + +void hud_resize (graphic_settings *gs, hud *h, txtd *t) { + hud_reset(gs, h, t); +} + + +// PROCESS +int hud_fnu_check (info_unit *u, infos *info) { + if (u->chassis == -1) return 1; + if (u->battery == -1) return 2; + if (u->brain == -1) return 3; + float curweight = info_unit_get_weight(info, u); + float maxweight = info->chassis[u->chassis].weight_max; + if (curweight > maxweight) { return 4; } + return 0; +} + +void hud_map_sel (info_unit *u, infos *info, int sel, int ind, + int8_t **n, int *bound, int size[]) +{ + if (sel == 0) { + *n = &u->chassis; + *bound = info->chassislen; + size[0] = 300; size[1] = 300; + } + if (sel == 1) { + *n = &u->battery; + *bound = info->batterieslen; + size[0] = 145; size[1] = 145; + } + if (sel == 2) { + *n = &u->armor[ind]; + *bound = info->armorslen; + size[0] = 150; size[1] = 250; + } + if (sel == 3) { + *n = &u->weapons[ind]; + *bound = info->weaponslen; + size[0] = 200; size[1] = 110; + } + if (sel == 4) { + *n = &u->augs[ind]; + *bound = info->augslen; + size[0] = 150; size[1] = 200; + } + if (sel == 5) { + *n = &u->brain; + *bound = info->brainslen; + size[0] = 145; size[1] = 145; + } +} + +void hud_process_sel (graphic_settings *gs, hud *h, MKb *mkb, + infos *info, army *ar, map *m, txtd *t, Mix_Chunk *sounds[]) +{ + if (mkb->mwheeldelta != 0) { + Mix_PlayChannel( -1, sounds[SOUND_MOUSE_WHEEL], 0 ); + } + int8_t *n = NULL; int bound = 0; int size[2]; + hud_map_sel(&h->fnu.uinfo, info, h->fnu.sel, h->fnu.ind, &n, &bound, size); + h->sc.nav += mkb->mwheeldelta*size[0]; + if (h->sc.nav > (*n+1)*size[0]) { + h->sc.nav = (*n+1)*size[0]; + } + if (h->sc.nav < (*n-bound+1)*size[0]) { + h->sc.nav = (*n-bound+1)*size[0]; + } + float mousepos[2] = { mkb->mx, mkb->my }; + if (mkb->mheld[0] == 1) { + float possc[2] = { h->sc.rect_back.x, h->sc.rect_back.y }; + float sizesc[2] = { h->sc.rect_back.w, h->sc.rect_back.h }; + if (!pt_rect(mousepos, possc, sizesc)) { + h->state = 1; + } else { + int i, inav = (int)h->sc.nav/size[0]; + for (int j=-7;j<h->sc.rect_back.w/size[0]+1; j++) { + i = *n+j-inav; + if (i<-1) continue; + if (i>=bound) break; + float x = h->sc.rect_back.x+size[0]*j + +(int)h->sc.nav%size[0]+h->sc.start; + float y = h->sc.rect_back.y; + float pos[2] = {x, y}, s[2] = { size[0], size[1] }; + if (pt_rect(mousepos, pos, s)) { + *n = i; + h->state = 1; + Mix_PlayChannel( -1, sounds[SOUND_MOUSE_CLICK_0], 0 ); + break; + } + } + } + } +} + + +void hud_edit_close(hud *h) { + h->nameedit = NULL; + h->og.edit_playername = 0; +} + +void hud_open_fnu (hud *h, info_unit *u, int i) { + h->state = 1; + h->fnu.uinfo = *u; + h->og.temp_modify = i; + hud_edit_close(h); +} + +void hud_close_fnu (hud *h, infos *info) { + if (hud_fnu_check(&h->fnu.uinfo, info) > 0) return; + if (h->og.temp_modify == -1) { + info_template_add(info, &h->fnu.uinfo); + } else { + info->templates[h->og.temp_modify] = h->fnu.uinfo; + } + h->state = 0; +} + + +void hud_og_place(hud *h, int i) { + h->og.temp_place = i; +} + + +void hud_open_sel (graphic_settings *gs, hud *h, + txtd *t, infos *info, SDL_Rect *ref) +{ + int8_t *n = NULL; int bound = 0; int size[2]; + hud_map_sel(&h->fnu.uinfo, info, h->fnu.sel, + h->fnu.ind, &n, &bound, size); + h->sc.nav = 0; if (*n == -1) h->sc.nav -= size[0]; + h->sc.ref = ref; + hud_resize(gs, h, t); + h->sc.rect_back.h = size[1]; +} + +void hud_process_form_new_unit (graphic_settings *gs, hud *h, MKb *mkb, + infos *info, army *ar, map *m, txtd *t, Mix_Chunk *sounds[]) +{ + float mousepos[2] = { mkb->mx, mkb->my }; + if (mkb->mheld[0] == 1) { + if (mouse_in_button(mousepos, t, &h->fnu.done)) { + hud_close_fnu(h, info); + Mix_PlayChannel( -1, sounds[SOUND_SUCCESS], 0 ); + /* + for (int i=0; i<ar->uslen; i++) { + unit *u = ar->us+i; + unit_init(info, ar, m, u->gridpos[0], u->gridpos[1], + &u->info, 0, u); + }*/ + } + float possc[2] = { h->fnu.rect_chassis.x, h->fnu.rect_chassis.y }; + float sizesc[2] = { h->fnu.rect_chassis.w, h->fnu.rect_chassis.h }; + if (pt_rect(mousepos, possc, sizesc)) { + h->fnu.sel = 0; h->state = 2; + hud_open_sel(gs, h, t, info, &h->fnu.rect_chassis); + } + float possb[2] = { h->fnu.rect_battery.x, h->fnu.rect_battery.y }; + float sizesb[2] = { h->fnu.rect_battery.w, h->fnu.rect_battery.h }; + if (pt_rect(mousepos, possb, sizesb)) { + h->fnu.sel = 1; h->state = 2; + hud_open_sel(gs, h, t, info, &h->fnu.rect_battery); + } + float possbr[2] = { h->fnu.rect_brain.x, h->fnu.rect_brain.y }; + float sizesbr[2] = { h->fnu.rect_brain.w, h->fnu.rect_brain.h }; + if (pt_rect(mousepos, possbr, sizesbr)) { + h->fnu.sel = 5; h->state = 2; + hud_open_sel(gs, h, t, info, &h->fnu.rect_brain); + } + if (h->fnu.uinfo.chassis != -1) { + for (int i=0; + i<info->chassis[h->fnu.uinfo.chassis].slot_armor; i++) + { + float possa[2] = { + h->fnu.rect_armor[i].x, h->fnu.rect_armor[i].y }; + float sizesa[2] = { + h->fnu.rect_armor[i].w, h->fnu.rect_armor[i].h }; + if (pt_rect(mousepos, possa, sizesa)) { + h->fnu.sel = 2; h->fnu.ind = i; h->state = 2; + hud_open_sel(gs, h, t, info, &h->fnu.rect_armor[i]); + } + } + for (int i=0; + i<info->chassis[h->fnu.uinfo.chassis].slot_weapon; i++) + { + float possa[2] = { + h->fnu.rect_weapons[i].x, h->fnu.rect_weapons[i].y }; + float sizesa[2] = { + h->fnu.rect_weapons[i].w, h->fnu.rect_weapons[i].h }; + if (pt_rect(mousepos, possa, sizesa)) { + h->fnu.sel = 3; h->fnu.ind = i; h->state = 2; + hud_open_sel(gs, h, t, info, &h->fnu.rect_weapons[i]); + } + } + for (int i=0; + i<info->chassis[h->fnu.uinfo.chassis].slot_aug; i++) + { + float possa[2] = { + h->fnu.rect_augs[i].x, h->fnu.rect_augs[i].y }; + float sizesa[2] = { + h->fnu.rect_augs[i].w, h->fnu.rect_augs[i].h }; + if (pt_rect(mousepos, possa, sizesa)) { + h->fnu.sel = 4; h->fnu.ind = i; h->state = 2; + hud_open_sel(gs, h, t, info, &h->fnu.rect_augs[i]); + } + } + } + } +} + +void hud_process_overlay_game (graphic_settings *gs, hud *h, MKb *mkb, + infos *info, army *ar, map *m, txtd *t, gamestate *gst, + net_client *netc, net_server *nets, Mix_Chunk *sounds[]) +{ + if (h->og.battle_state == 1) { + if (nets->sock_client == NULL) { + net_server_accept(nets); + } else { + char buffer[1024*64]; + int len = net_server_recv(nets, buffer); + if (len != -1) { + h->og.battle_state = 3; + + int armysize = sizeof(unit)*gst->army_bp[0].uslen; + char data[armysize]; + memcpy(data, gst->army_bp[0].us, armysize); + net_server_send(nets, data, armysize); + printf("send (%d)\n", armysize); + + memcpy(gst->army_bp[1].us, buffer, len); + gst->army_bp[1].uslen = len/sizeof(unit); + gst->playernum = 2; + gst_tobattle(gst); + gst->cam[0] = -gs->resx/2+gst->map_battle.sx*gst->map_battle.ts/2; + gst->cam[1] = -gs->resy/2+gst->map_battle.sy*gst->map_battle.ts/2; + h->state = 4; + } + } + } + if (h->og.battle_state == 2) { + char buffer[1024*64]; + int len = net_client_recv(netc, buffer); + if (len != -1) { + h->og.battle_state = 3; + + memcpy(gst->army_bp[1].us, buffer, len); + gst->army_bp[1].uslen = len/sizeof(unit); + gst->playernum = 2; + gst_tobattle(gst); + gst->cam[0] = -gs->resx/2+gst->map_battle.sx*gst->map_battle.ts/2; + gst->cam[1] = -gs->resy/2+gst->map_battle.sy*gst->map_battle.ts/2; + h->state = 4; + } + } + + float mousepos[2] = { mkb->mx, mkb->my }; + if (mkb->mheld[0] == 1) { + if (mouse_in_button(mousepos, t, &h->og.new_template)) { + info_unit u; info_unit_init(&u); + hud_open_fnu(h, &u, -1); + h->og.temp_place = -1; + } + + if (mouse_in_button(mousepos, t, &h->og.save_templates)) { + info_save_templates(info, "default"); + Mix_PlayChannel( -1, sounds[SOUND_SUCCESS], 0 ); + } + + if (mouse_in_button(mousepos, t, &h->og.start_battle)) { + /* + army_move(info, ar, m); + army_fire(info, ar, m);*/ + gst_tobattle(gst); + gst->cam[0] = -gs->resx/2+gst->map_battle.sx*gst->map_battle.ts/2; + gst->cam[1] = -gs->resy/2+gst->map_battle.sy*gst->map_battle.ts/2; + h->og.battle_state = 3; + h->state = 4; + Mix_PlayChannel( -1, sounds[SOUND_SUCCESS], 0 ); + } + + if (mouse_in_button(mousepos, t, &h->og.join_game)) { + printf("open client\n"); + net_client_open(netc); + int conn = net_client_connect(netc, "127.0.0.1", SERVER_PORT); + if (conn == 0) { + int armysize = sizeof(unit)*gst->army_bp[0].uslen; + char data[armysize]; + memcpy(data, gst->army_bp[0].us, armysize); + net_client_send(netc, data, armysize); + printf("send (%d)\n", armysize); + } + h->og.battle_state = 2; + } + + if (mouse_in_button(mousepos, t, &h->og.host_game)) { + printf("open server\n"); + net_server_open(nets, SERVER_PORT); + h->og.battle_state = 1; + } + + if (mouse_in_button(mousepos, t, &h->og.save_army)) { + info_save_army(gst->army_bp+0, h->og.army_listcur); + h->og.army_listlen = info_army_get_list(h->og.army_list); + } + + if (h->og.temp_place != -1) { + int x = (int)((mkb->mx+gst->cam[0])/32); + int y = (int)((mkb->my+gst->cam[1])/32); + if (x >= 0 && y >= 0 && x < m->sx && y < m->sy) { + if (ar->grid[xytoi(m,x,y)] == NULL) { + unit u; + unit_init(info, ar, m, x, y, + info->templates+h->og.temp_place, 0, &u); + army_spawn(ar, m, u); + } + } else { + h->og.temp_place = -1; + } + } + + for (int i=0; i<info->templateslen; i++) { + float x = h->og.rect_templates.x+5; + float y = h->og.rect_templates.y+5 + i*20 + 30; + float wedit = get_text_width("edit", t); + float possa[2] = { x, y }; + float sizesa[2] = { wedit+4*2, 11+4*2 }; + if (pt_rect(mousepos, possa, sizesa)) { + hud_open_fnu(h, info->templates+i, i); + h->og.temp_place = -1; + } + float wplace = get_text_width("place", t); + float posp[2] = { x+wedit+4*2+5, y }; + float sizep[2] = { wplace+4*2, 11+4*2 }; + if (pt_rect(mousepos, posp, sizep)) { + hud_og_place(h, i); + } + } + + for (int i=0; i<h->og.army_listlen; i++) { + float x = h->og.rect_army.x+5; + float y = h->og.rect_army.y+5 + i*20 + 30; + float wload = get_text_width("load", t); + float posp[2] = { x, y }; + float sizep[2] = { wload+4*2, 11+4*2 }; + if (pt_rect(mousepos, posp, sizep)) { + strcpy(h->og.army_listcur, h->og.army_list[i]); + info_load_army(gst->army_bp+0, h->og.army_listcur); + Mix_PlayChannel( -1, sounds[SOUND_SUCCESS], 0 ); + } + } + + if (h->nameedit == NULL) { + float pn[2] = { h->og.rect_battle.x+5, h->og.rect_battle.y+5 }; + char sn[64]; sprintf(sn, "PLAYER NAME: %s", h->og.playername); + float sizen[2] = { get_text_width(sn, t), 10 }; + if (pt_rect(mousepos, pn, sizen)) { + h->nameedit = h->og.playername; + printf("editing this %s\n", h->nameedit); + h->og.edit_playername = 1; + } + } else { + Mix_PlayChannel( -1, sounds[SOUND_SUCCESS], 0 ); + hud_edit_close(h); + } + } + + // rm unit + if (mkb->mheld[2] == 1) { + Mix_PlayChannel( -1, sounds[SOUND_MOUSE_CLICK_0], 0 ); + int x = (int)((mkb->mx+gst->cam[0])/32); + int y = (int)((mkb->my+gst->cam[1])/32); + if (x >= 0 && y >= 0 && x < m->sx && y < m->sy) { + if (ar->grid[xytoi(m,x,y)] != NULL) { + unit_remove(ar, m, ar->grid[xytoi(m,x,y)]); + } + } + } +} + +void hud_edit_name(hud *h, MKb *mkb, Mix_Chunk *sounds[]) { + for (int i=0; i<mkb->kbnum; i++) { + if (mkb->kb[i] >= SDL_SCANCODE_A + && mkb->kb[i] <= SDL_SCANCODE_Z) { + if (strlen(h->nameedit) < 31) { + char c = mkb->kb[i]-SDL_SCANCODE_A+'a'; + if (SDL_GetModState() & KMOD_SHIFT) { + c = mkb->kb[i]-SDL_SCANCODE_A+'A'; + } + sprintf(h->nameedit, "%s%c", h->nameedit, c); + } + } + } + if (mkb_search(mkb, SDL_SCANCODE_SPACE)) { + Mix_PlayChannel( -1, sounds[SOUND_SUCCESS], 0 ); + if (strlen(h->nameedit) < 31) { + sprintf(h->nameedit, "%s ", h->nameedit); + } + } + if (mkb_search(mkb, SDL_SCANCODE_BACKSPACE)) { + if (strlen(h->nameedit) > 0) + h->nameedit[strlen(h->nameedit)-1] = '\0'; + } + if (mkb_search(mkb, SDL_SCANCODE_ESCAPE)) { + Mix_PlayChannel( -1, sounds[SOUND_SUCCESS], 0 ); + hud_edit_close(h); return; + } +} + +void hud_process (graphic_settings *gs, hud *h, MKb *mkb, + infos *info, army *ar, map *m, txtd *t, gamestate *gst, + net_client *netc, net_server *nets, Mix_Chunk *sounds[]) +{ + if (h->nameedit != NULL) { hud_edit_name(h, mkb, sounds); } + switch (h->state) { + case 0: + hud_process_overlay_game(gs, h, mkb, info, ar, m, t, gst, + netc, nets, sounds); + break; + case 1: hud_process_form_new_unit(gs, h, mkb, info, ar, m, t, + sounds); break; + case 2: hud_process_sel(gs, h, mkb, info, ar, m, t, sounds); break; + } +} + + + +// RENDER +void hud_render_sel (hud_sel *sc, MKb *mkb, info_unit *u, + SDL_Renderer* rend, SDL_Texture *sprites, txtd *t, infos *info, + int sel, int ind) +{ + int8_t *n = NULL; int bound = 0; int size[2]; + hud_map_sel(u, info, sel, ind, &n, &bound, size); + SDL_SetRenderDrawColor(rend, 150, 200, 0, 255); + SDL_RenderFillRect(rend, &sc->rect_back); + SDL_SetRenderDrawColor(rend, 0, 0, 0, 255); + SDL_RenderDrawRect(rend, &sc->rect_back); + SDL_RenderSetClipRect(rend, &sc->rect_back); + int i; + for (int j=-7;j<sc->rect_back.w/size[0]+1; j++) { + i = *n+j - (int)sc->nav/size[0]; + if (i<-1) continue; + if (i>=bound) break; + float x = sc->rect_back.x+size[0]*j+(int)sc->nav%size[0]+sc->start; + float y = sc->rect_back.y; + SDL_Rect r = { x, y, size[0]+1, size[1] }; + SDL_SetRenderDrawColor(rend, 150, 200, 120, 255); + SDL_RenderFillRect(rend, &r); + SDL_SetRenderDrawColor(rend, 0, 0, 0, 255); + SDL_RenderDrawRect(rend, &r); + if (sel==0) render_view_chassis(rend, t, x, y, info, i, sprites); + if (sel==1) render_view_battery(rend, t, x, y, info, i); + if (sel==2) render_view_armor_detail(rend, t, x, y, info, i); + if (sel==3) render_view_weapon_detail(rend, t, x, y, info, i); + if (sel==4) render_view_aug_detail(rend, t, x, y, info, i); + if (sel==5) render_view_brain(rend, t, x, y, info, i); + } + SDL_RenderSetClipRect(rend, NULL); +} + +void hud_render_form_new_unit (form_new_unit *fnu, MKb *mkb, + SDL_Renderer* rend, txtd *t, infos *info, SDL_Texture *sprites) +{ + SDL_SetRenderDrawColor(rend, 150, 200, 255, 255); + SDL_RenderFillRect(rend, &fnu->rect_back); + + SDL_SetRenderDrawColor(rend, 200, 0, 255, 255); + SDL_RenderFillRect(rend, &fnu->rect_chassis); + SDL_RenderFillRect(rend, &fnu->rect_brain); + SDL_RenderFillRect(rend, &fnu->rect_battery); + + SDL_SetRenderDrawColor(rend, 255, 150, 50, 255); + SDL_RenderFillRect(rend, &fnu->rect_stats); + + SDL_SetRenderDrawColor(rend, 0, 0, 0, 255); + SDL_RenderDrawRect(rend, &fnu->rect_back); + SDL_RenderDrawRect(rend, &fnu->rect_chassis); + SDL_RenderDrawRect(rend, &fnu->rect_brain); + SDL_RenderDrawRect(rend, &fnu->rect_battery); + SDL_RenderDrawRect(rend, &fnu->rect_stats); + + render_view_stats(rend, t, fnu->rect_stats.x, fnu->rect_stats.y, + info, &fnu->uinfo); + + if (fnu->uinfo.chassis != -1) { + for (int i=0; i<info->chassis[fnu->uinfo.chassis].slot_weapon; i++) { + SDL_SetRenderDrawColor(rend, 200, 100, 255, 255); + SDL_RenderFillRect(rend, fnu->rect_weapons+i); + SDL_SetRenderDrawColor(rend, 0, 0, 0, 255); + SDL_RenderDrawRect(rend, fnu->rect_weapons+i); + render_view_weapon(rend, t, + fnu->rect_weapons[i].x, + fnu->rect_weapons[i].y, info, fnu->uinfo.weapons[i]); + } + for (int i=0; i<info->chassis[fnu->uinfo.chassis].slot_armor; i++) { + SDL_SetRenderDrawColor(rend, 200, 200, 255, 255); + SDL_RenderFillRect(rend, fnu->rect_armor+i); + SDL_SetRenderDrawColor(rend, 0, 0, 0, 255); + SDL_RenderDrawRect(rend, fnu->rect_armor+i); + render_view_armor(rend, t, + fnu->rect_armor[i].x, + fnu->rect_armor[i].y, info, fnu->uinfo.armor[i]); + } + for (int i=0; i<info->chassis[fnu->uinfo.chassis].slot_aug; i++) { + SDL_SetRenderDrawColor(rend, 200, 200, 255, 255); + SDL_RenderFillRect(rend, fnu->rect_augs+i); + SDL_SetRenderDrawColor(rend, 0, 0, 0, 255); + SDL_RenderDrawRect(rend, fnu->rect_augs+i); + render_view_aug(rend, t, + fnu->rect_augs[i].x, + fnu->rect_augs[i].y, info, fnu->uinfo.augs[i]); + } + } + + char schassis[32] = "CHASSIS"; + float wchassis = get_text_width(schassis, t)*2; + float pchassis[2] = { + fnu->rect_chassis.x+fnu->rect_chassis.w/2 - wchassis / 2, + fnu->rect_chassis.y+fnu->rect_chassis.h + 7 + }; + render_text_scaled(rend, schassis, pchassis, t, 2); + + char sbrain[32] = "CONTROLLER"; + float wbrain = get_text_width(sbrain, t)*2; + float pbrain[2] = { + fnu->rect_brain.x+fnu->rect_brain.w/2 - wbrain / 2, + fnu->rect_brain.y - 16-7 + }; + render_text_scaled(rend, sbrain, pbrain, t, 2); + + char sbattery[32] = "BATTERY"; + float wbattery = get_text_width(sbattery, t)*2; + float pbattery[2] = { + fnu->rect_battery.x+fnu->rect_battery.w/2 - wbattery / 2, + fnu->rect_battery.y - 16-7 + }; + render_text_scaled(rend, sbattery, pbattery, t, 2); + + char sweapons[32] = "WEAPONS"; + float wweapons = get_text_width(sweapons, t)*2; + float pweapons[2] = { + fnu->rect_weapons[0].x+fnu->rect_weapons[0].w/2 - wweapons / 2, + fnu->rect_weapons[0].y - 16-7 + }; + render_text_scaled(rend, sweapons, pweapons, t, 2); + + char sarmor[32] = "ARMOR"; + float warmor = get_text_width(sarmor, t)*2; + float parmor[2] = { + fnu->rect_armor[0].x+fnu->rect_armor[0].w/2 - warmor / 2, + fnu->rect_armor[0].y - 16-7 + }; + render_text_scaled(rend, sarmor, parmor, t, 2); + + char saugs[32] = "AUGMENTS"; + float waugs = get_text_width(saugs, t)*2; + float pagus[2] = { + fnu->rect_augs[0].x+fnu->rect_augs[0].w/2 - waugs / 2, + fnu->rect_augs[0].y - 16-7 + }; + render_text_scaled(rend, saugs, pagus, t, 2); + + render_button(rend, t, &fnu->done); + + int err = hud_fnu_check(&fnu->uinfo, info); + char serr[32] = "ok"; + if (err==1) strcpy(serr, "select a chassis"); + if (err==2) strcpy(serr, "select a battery"); + if (err==3) strcpy(serr, "select a controller"); + if (err==4) strcpy(serr, "overburdened, remove weight"); + float werr = get_text_width(serr, t); + float perr[2] = { + fnu->done.pos[0]-werr-10, + fnu->done.pos[1]+fnu->done.pad + }; + render_text_scaled(rend, serr, perr, t, 1); + + render_view_chassis(rend, t, + fnu->rect_chassis.x, fnu->rect_chassis.y, + info, fnu->uinfo.chassis, sprites); + render_view_battery(rend, t, + fnu->rect_battery.x, fnu->rect_battery.y, info, fnu->uinfo.battery); + render_view_brain(rend, t, + fnu->rect_brain.x, fnu->rect_brain.y, info, fnu->uinfo.brain); +} + +void hud_render_overlay_game (overlay_game *og, MKb *mkb, + SDL_Renderer* rend, txtd *t, infos *info, SDL_Texture *sprites) +{ + SDL_SetRenderDrawColor(rend, 40, 150, 200, 255); + SDL_RenderFillRect(rend, &og->rect_templates); + SDL_SetRenderDrawColor(rend, 0, 0, 0, 255); + SDL_RenderDrawRect(rend, &og->rect_templates); + char stemp[32] = "TEMPLATES"; + float ptemp[2] = { + og->rect_templates.x+10, + og->rect_templates.y+10 + }; + render_text_scaled(rend, stemp, ptemp, t, 2); + + render_button(rend, t, &og->new_template); + render_button(rend, t, &og->save_templates); + + for (int i=0; i<info->templateslen; i++) { + float x = og->rect_templates.x+5; + float y = og->rect_templates.y+5 + i*20 + 30; + render_view_template(rend, t, x, y, info, i); + } + + SDL_SetRenderDrawColor(rend, 0, 200, 120, 255); + SDL_RenderFillRect(rend, &og->rect_army); + SDL_SetRenderDrawColor(rend, 0, 0, 0, 255); + SDL_RenderDrawRect(rend, &og->rect_army); + char sarmy[32] = "ARMY"; + float parmy[2] = { + og->rect_army.x+10, + og->rect_army.y+10 + }; + render_text_scaled(rend, sarmy, parmy, t, 2); + + render_button(rend, t, &og->save_army); + + button b = { "load", 4, { 0, 0 } }; + for (int i=0; i<og->army_listlen; i++) { + float x = og->rect_army.x+5; + float y = og->rect_army.y+5 + i*20 + 30; + float bw = get_text_width("load", t)+4*2; + b.pos[0] = x; b.pos[1] = y; + render_button(rend, t, &b); + float pa[2] = { x+bw+5, y+4 }; + render_text_scaled(rend, og->army_list[i], pa, t, 1); + if (strcmp(og->army_listcur, og->army_list[i]) == 0) { + float w = get_text_width(og->army_list[i], t); + float pe[2] = { x+bw+5+w+5, y+4 }; + render_text_scaled(rend, "<- editing", pe, t, 1); + } + } + + SDL_SetRenderDrawColor(rend, 250, 60, 60, 255); + SDL_RenderFillRect(rend, &og->rect_battle); + SDL_SetRenderDrawColor(rend, 0, 0, 0, 255); + SDL_RenderDrawRect(rend, &og->rect_battle); + + float pn[2] = { og->rect_battle.x+5, og->rect_battle.y+5 }; + char sn[64]; + if (og->edit_playername == 1) { + sprintf(sn, "PLAYER NAME: %s_", og->playername); + printf("looool\n"); + } else { + sprintf(sn, "PLAYER NAME: %s", og->playername); + } + render_text_scaled(rend, sn, pn, t, 1); + + render_button(rend, t, &og->host_game); + render_button(rend, t, &og->join_game); + render_button(rend, t, &og->start_battle); + + if (og->temp_place != -1) { + SDL_Rect srcRect = { + info->templates[og->temp_place].chassis*32, 32, 32, 32 }; + SDL_Rect dstRect = { mkb->mx - 16, mkb->my - 16, 32, 32 }; + SDL_RenderCopy(rend, sprites, &srcRect, &dstRect); + } +} + +void hud_render (hud *h, SDL_Renderer* rend, txtd *t, MKb *mkb, infos *info, + SDL_Texture *sprites) +{ + switch (h->state) { + case 0: + hud_render_overlay_game(&h->og, mkb, rend, t, info, sprites); + break; + case 1: + hud_render_overlay_game(&h->og, mkb, rend, t, info, sprites); + hud_render_form_new_unit(&h->fnu, mkb, rend, t, info, sprites); + break; + case 2: + hud_render_overlay_game(&h->og, mkb, rend, t, info, sprites); + hud_render_form_new_unit(&h->fnu, mkb, rend, t, info, sprites); + hud_render_sel(&h->sc, mkb, &h->fnu.uinfo, + rend, sprites, t, info, h->fnu.sel, h->fnu.ind); + break; + } +}
\ No newline at end of file diff --git a/hud/hud.h b/hud/hud.h new file mode 100644 index 0000000..2728bb2 --- /dev/null +++ b/hud/hud.h @@ -0,0 +1,74 @@ +#ifndef HUD_H +#define HUD_H + +#include <SDL.h> +#include <SDL_mixer.h> + +#include <render_text.h> +#include <button.h> +#include <graphicsettings.h> +#include <mkb.h> +#include <info.h> +#include <units.h> +#include <map.h> +#include <gst.h> +#include <net.h> + +typedef struct { + float start; + float nav; + SDL_Rect rect_back; + SDL_Rect *ref; +} hud_sel; + +typedef struct { + button new_template; + button save_templates; + button save_army; + button start_battle; + button host_game; + button join_game; + SDL_Rect rect_battle; + SDL_Rect rect_templates; + int temp_modify; + int temp_place; + SDL_Rect rect_army; + char army_list[64][32]; + int army_listlen; + char army_listcur[32]; + char playername[32]; + int battle_state; + int edit_playername; +} overlay_game; + +typedef struct { + SDL_Rect rect_back; + SDL_Rect rect_chassis; + SDL_Rect rect_brain; + SDL_Rect rect_battery; + SDL_Rect rect_weapons[8]; + SDL_Rect rect_armor[8]; + SDL_Rect rect_augs[8]; + SDL_Rect rect_stats; + button done; + info_unit uinfo; + int sel, ind; +} form_new_unit; + +typedef struct { + hud_sel sc; + overlay_game og; + form_new_unit fnu; + int state; + char *nameedit; +} hud; + +void hud_init(graphic_settings *gs, hud *h, txtd *t); +void hud_resize (graphic_settings *gs, hud *h, txtd *t); +void hud_process (graphic_settings *gs, hud *h, MKb *mkb, + infos *info, army *ar, map *m, txtd *t, gamestate *gst, + net_client *netc, net_server *nets, Mix_Chunk *sounds[]); +void hud_render (hud *h, SDL_Renderer* rend, txtd *t, MKb *mkb, infos *info, + SDL_Texture *sprites); + +#endif
\ No newline at end of file diff --git a/hud/hud_views.c b/hud/hud_views.c new file mode 100644 index 0000000..557ff1f --- /dev/null +++ b/hud/hud_views.c @@ -0,0 +1,380 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#include <hud_views.h> + +void render_view_stats (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, info_unit *tm) +{ + float h = 10; + float pname[2] = { px+10, py+h }; + char sname[64]; sprintf(sname, "STATS"); + render_text_scaled(rend, sname, pname, t, 2); + h += 35; + + float calcweight = info_unit_get_weight(info, tm); + float maxweight = info->chassis[tm->chassis].weight_max; + float pw[2] = { px+10, py+h }; + char sw[64]; sprintf(sw, "WEIGHT: %.0f/%.0f", + calcweight, maxweight); + render_text_scaled(rend, sw, pw, t, 1); + h += 15; + + float hp = info_unit_get_health(info, tm); + float php[2] = { px+10, py+h }; + char shp[64]; sprintf(shp, "HP: %.2f", hp); + render_text_scaled(rend, shp, php, t, 1); + h += 15; + + float speed = info_unit_get_speed(info, tm); + float pspeed[2] = { px+10, py+h }; + char sspeed[64]; sprintf(sspeed, "SPEED: %.2f", speed); + render_text_scaled(rend, sspeed, pspeed, t, 1); + h += 15; + + float dps = info_unit_get_dps(info, tm); + float pdps[2] = { px+10, py+h }; + char sdps[64]; sprintf(sdps, "DAMAGE PER TURN: %.2f", dps); + render_text_scaled(rend, sdps, pdps, t, 1); + h += 20; + + float part[2] = { px+10, py+h }; + render_text_scaled(rend, "ARMOR:", part, t, 1); + h += 15; + + for (int i=0; i<7; i++) { + float ar = info_unit_get_armor(info, tm, i); + float par[2] = { px+10, py+h }; + char sar[64]; sprintf(sar, "%s: %.1f%", info->damage_types[i], ar); + render_text_scaled(rend, sar, par, t, 1); + h += 15; + } + h += 5; +} + +void render_view_chassis (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int chassis, SDL_Texture *sprites) +{ + if (chassis != -1) { + float pname[2] = { px+10, py+10 }; + char sname[64]; sprintf(sname, "%s", + info->chassis[chassis].name); + render_text_scaled(rend, sname, pname, t, 2); + float pweight[2] = { px+10, py+40 }; + char sweight[64]; sprintf(sweight, "MAX WEIGHT: %0.0f", + info->chassis[chassis].weight_max); + render_text_scaled(rend, sweight, pweight, t, 1); + float php[2] = { px+10, py+55 }; + char shp[64]; sprintf(shp, "HP: %0.1f", + info->chassis[chassis].hp); + render_text_scaled(rend, shp, php, t, 1); + float pspeed[2] = { px+10, py+70 }; + char sspeed[64]; sprintf(sspeed, "SPEED: %0.2f tiles/turn", + info->chassis[chassis].speed); + render_text_scaled(rend, sspeed, pspeed, t, 1); + + SDL_Rect srcRect = { chassis*32, 32, 32, 32 }; + SDL_Rect dstRect = { px+300-32-10, py+10, 32, 32 }; + SDL_RenderCopy(rend, sprites, &srcRect, &dstRect); + } else { + float pname[2] = { px+10, py+10 }; + render_text_scaled(rend, "select a chassis...", pname, t, 1); + } +} + +void render_view_battery (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int batt) +{ + if (batt != -1) { + float pname[2] = { px+10, py+10 }; + char sname[64]; sprintf(sname, "%s", + info->batteries[batt].name); + render_text_scaled(rend, sname, pname, t, 1); + float pweight[2] = { px+10, py+40 }; + char sweight[64]; sprintf(sweight, "WEIGHT: %0.0f", + info->batteries[batt].weight); + render_text_scaled(rend, sweight, pweight, t, 1); + float pcapacity[2] = { px+10, py+55 }; + char scapacity[64]; sprintf(scapacity, "CAPACITY: %0.1f", + info->batteries[batt].capacity); + render_text_scaled(rend, scapacity, pcapacity, t, 1); + float prech[2] = { px+10, py+70 }; + char srech[64]; + if (info->batteries[batt].recharge == 0) { + strcpy(srech, "NOT RECHARGEABLE"); + } else { + strcpy(srech, "RECHARGEABLE"); + } + render_text_scaled(rend, srech, prech, t, 1); + } else { + float pname[2] = { px+10, py+10 }; + render_text_scaled(rend, "select a battery...", pname, t, 1); + } +} + + +void render_view_armor (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int armor) +{ + if (armor != -1) { + float pname[2] = { px+10, py+10 }; + char sname[64]; sprintf(sname, "%s", info->armors[armor].name); + render_text_scaled(rend, sname, pname, t, 1); + char sa[64]; int j=0; + char temp[16] = "red: "; + strcpy(sa+j, temp); + j += strlen(temp); + for (int i=0; i<7; i++) { + if (i<7-1) { + sprintf(temp, "%.0f, ", info->armors[armor].armor[i]); + } else { + sprintf(temp, "%.0f", info->armors[armor].armor[i]); + } + strcpy(sa+j, temp); + j += strlen(temp); + } + sa[j] = '\0'; + float pa[2] = { px+10, py+25 }; + render_text_scaled(rend, sa, pa, t, 1); + } else { + float pname[2] = { px+10, py+10 }; + render_text_scaled(rend, "select an armor...", pname, t, 1); + } +} + +void render_view_armor_detail (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int armor) +{ + if (armor != -1) { + float pname[2] = { px+10, py+10 }; + char sname[64]; sprintf(sname, "%s", info->armors[armor].name); + render_text_scaled(rend, sname, pname, t, 1); + float pweight[2] = { px+10, py+40 }; + char sweight[64]; sprintf(sweight, "WEIGHT: %0.0f", + info->armors[armor].weight); + render_text_scaled(rend, sweight, pweight, t, 1); + + float pred[2] = { px+10, py+60 }; + render_text_scaled(rend, "DAMAGE REDUCTION", pred, t, 1); + + int h=0; + for (int i=0; i<7; i++) { + if (info->armors[armor].armor[i] < 0.001) continue; + float pa[2] = { px+10, py+75+h*15 }; + char sa[64]; sprintf(sa, "%s: %.1f%", + info->damage_types[i], info->armors[armor].armor[i]); + render_text_scaled(rend, sa, pa, t, 1); + h++; + } + } else { + render_view_weapon(rend, t, px, py, info, armor); + } +} + + +void render_view_weapon (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int weapon) +{ + if (weapon != -1) { + float pname[2] = { px+10, py+10 }; + char sname[64]; sprintf(sname, "%s", + info->weapons[weapon].name); + render_text_scaled(rend, sname, pname, t, 1); + float pweight[2] = { px+10, py+30 }; + char sweight[64]; sprintf(sweight, "WEIGHT: %.0f", + info->weapons[weapon].weight); + render_text_scaled(rend, sweight, pweight, t, 1); + float ptype[2] = { px+10, py+45 }; + char stype[64]; sprintf(stype, "DAMAGE TYPE: %s", + info->damage_types[info->weapons[weapon].damage_type]); + render_text_scaled(rend, stype, ptype, t, 1); + float pdamage[2] = { px+10, py+60 }; + char sdamage[64]; sprintf(sdamage, "DAMAGE: %.0f", + info->weapons[weapon].damage); + render_text_scaled(rend, sdamage, pdamage, t, 1); + float prange[2] = { px+10, py+75 }; + char srange[64]; sprintf(srange, "RANGE: %.0f", + info->weapons[weapon].range); + render_text_scaled(rend, srange, prange, t, 1); + float pcool[2] = { px+10, py+90 }; + char scool[64]; sprintf(scool, "COOLDOWN: %.0f", + info->weapons[weapon].cooldown); + render_text_scaled(rend, scool, pcool, t, 1); + } else { + float pname[2] = { px+10, py+10 }; + render_text_scaled(rend, "select a weapon...", pname, t, 1); + } +} + +void render_view_weapon_detail (SDL_Renderer* rend, txtd *t, + int px, int py, infos *info, int weapon) +{ + if (weapon != -1) { + float pname[2] = { px+10, py+10 }; + char sname[64]; sprintf(sname, "%s", + info->weapons[weapon].name); + render_text_scaled(rend, sname, pname, t, 1); + float pweight[2] = { px+10, py+30 }; + char sweight[64]; sprintf(sweight, "WEIGHT: %.0f", + info->weapons[weapon].weight); + render_text_scaled(rend, sweight, pweight, t, 1); + float ptype[2] = { px+10, py+45 }; + char stype[64]; sprintf(stype, "DAMAGE TYPE: %s", + info->damage_types[info->weapons[weapon].damage_type]); + render_text_scaled(rend, stype, ptype, t, 1); + float pdamage[2] = { px+10, py+60 }; + char sdamage[64]; sprintf(sdamage, "DAMAGE: %.0f", + info->weapons[weapon].damage); + render_text_scaled(rend, sdamage, pdamage, t, 1); + float prange[2] = { px+10, py+75 }; + char srange[64]; sprintf(srange, "RANGE: %.0f", + info->weapons[weapon].range); + render_text_scaled(rend, srange, prange, t, 1); + float pcool[2] = { px+10, py+90 }; + char scool[64]; sprintf(scool, "COOLDOWN: %.0f", + info->weapons[weapon].cooldown); + render_text_scaled(rend, scool, pcool, t, 1); + } else { + render_view_weapon(rend, t, px, py, info, weapon); + } +} + + +void render_view_aug (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int aug) +{ + if (aug != -1) { + float pname[2] = { px+10, py+10 }; + char sname[64]; sprintf(sname, "%s", + info->augs[aug].name); + render_text_scaled(rend, sname, pname, t, 1); + float pweight[2] = { px+10, py+30 }; + char sweight[64]; sprintf(sweight, "WEIGHT: %.0f", + info->augs[aug].weight); + render_text_scaled(rend, sweight, pweight, t, 1); + } else { + float pname[2] = { px+10, py+10 }; + render_text_scaled(rend, "select an augment...", pname, t, 1); + } +} + +void render_view_aug_detail (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int aug) +{ + if (aug != -1) { + float h = 10; + float pname[2] = { px+10, py+h }; + char sname[64]; sprintf(sname, "%s", + info->augs[aug].name); + render_text_scaled(rend, sname, pname, t, 1); + h += 20; + + float pweight[2] = { px+10, py+h }; + char sweight[64]; sprintf(sweight, "WEIGHT: %.0f", + info->augs[aug].weight); + render_text_scaled(rend, sweight, pweight, t, 1); + h += 15; + + float range = info->augs[aug].add_range; + if (range != 0) { + float p[2] = { px+10, py+h }; + char s[64]; sprintf(s, "RANGE: %.1f", range); + render_text_scaled(rend, s, p, t, 1); + h += 15; + } + + float cooldown = info->augs[aug].add_cooldown; + if (cooldown != 0) { + float p[2] = { px+10, py+h }; + char s[64]; sprintf(s, "COOLDOWN: %.2f", cooldown); + render_text_scaled(rend, s, p, t, 1); + h += 15; + } + + float speed = info->augs[aug].add_speed; + if (speed != 0) { + float p[2] = { px+10, py+h }; + char s[64]; sprintf(s, "SPEED: %.2f", speed); + render_text_scaled(rend, s, p, t, 1); + h += 15; + } + + float hp = info->augs[aug].add_hp; + if (hp != 0) { + float p[2] = { px+10, py+h }; + char s[64]; sprintf(s, "HP: %.1f", hp); + render_text_scaled(rend, s, p, t, 1); + h += 15; + } + + h += 5; + + float sum = 0; + for (int i=0; i<7; i++) sum += fabs(info->augs[aug].add_armor[i]); + if (sum != 0) { + float p[2] = { px+10, py+h }; + render_text_scaled(rend, "ARMOR: ", p, t, 1); + h += 15; + for (int i=0; i<7; i++) { + if (info->augs[aug].add_armor[i] == 0) continue; + float pa[2] = { px+10, py+h }; + char sa[64]; sprintf(sa, "%s: %.1f%", + info->damage_types[i], info->augs[aug].add_armor[i]); + render_text_scaled(rend, sa, pa, t, 1); + h += 15; + } + } + + sum = 0; + for (int i=0; i<7; i++) sum += fabs(info->augs[aug].add_damage[i]); + if (sum != 0) { + float p[2] = { px+10, py+h }; + render_text_scaled(rend, "DAMAGE: ", p, t, 1); + h += 15; + for (int i=0; i<7; i++) { + if (info->augs[aug].add_damage[i] == 0) continue; + float pa[2] = { px+10, py+h }; + char sa[64]; sprintf(sa, "%s: %.1f%", + info->damage_types[i], info->augs[aug].add_damage[i]); + render_text_scaled(rend, sa, pa, t, 1); + h += 15; + } + } + } else { + render_view_aug(rend, t, px, py, info, aug); + } +} + + +void render_view_brain (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int brain) +{ + if (brain != -1) { + float pname[2] = { px+10, py+10 }; + char sname[64]; sprintf(sname, "%s", + info->brains[brain].name); + render_text_scaled(rend, sname, pname, t, 1); + } else { + float pname[2] = { px+10, py+10 }; + render_text_scaled(rend, "select a controller...", pname, t, 1); + } +} + + +void render_view_template (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int temp) +{ + button b = { "edit", 4, { px, py } }; + render_button(rend, t, &b); + float wedit = get_text_width("edit", t); + + button b1 = { "place", 4, { px+wedit+2*4+5, py } }; + render_button(rend, t, &b1); + float wplace = get_text_width("place", t); + + float pname[2] = { wplace+wedit+4*4+10+px, py+4 }; + char *sname = info->chassis[info->templates[temp].chassis].name; + render_text_scaled(rend, sname, pname, t, 1); +}
\ No newline at end of file diff --git a/hud/hud_views.h b/hud/hud_views.h new file mode 100644 index 0000000..ceced23 --- /dev/null +++ b/hud/hud_views.h @@ -0,0 +1,47 @@ +#ifndef HUD_VIEWS_H +#define HUD_VIEWS_H + +#include <SDL.h> + +#include <render_text.h> +#include <button.h> +#include <graphicsettings.h> +#include <mkb.h> +#include <info.h> +#include <units.h> +#include <hud.h> + +void render_view_stats (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, info_unit *tm); + + +void render_view_chassis (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int chassis, SDL_Texture *sprites); + +void render_view_battery (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int batt); + +void render_view_armor (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int armor); +void render_view_armor_detail (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int armor); + +void render_view_weapon (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int weapon); +void render_view_weapon_detail (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int weapon); + +void render_view_aug (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int aug); +void render_view_aug_detail (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int aug); + +void render_view_brain (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int brain); + + +void render_view_template (SDL_Renderer* rend, txtd *t, int px, int py, + infos *info, int temp); + + +#endif
\ No newline at end of file |