source: abuse/trunk/src/loader2.cpp @ 40

Last change on this file since 40 was 40, checked in by Sam Hocevar, 15 years ago
  • Fix a few more warnings.
  • Remove -Wshadow from the warnings because it is too verbose for now.
  • Remove warning flags that have no meaning in C++.
File size: 11.5 KB
Line 
1#include "timing.hpp"
2#include "loader2.hpp"
3#include "chars.hpp"
4#include "specs.hpp"
5#include "parse.hpp"
6#include "lisp.hpp"
7#include "jrand.hpp"
8#include "menu.hpp"
9#include "dev.hpp"
10#include "director.hpp"
11
12#include "dev.hpp"
13#include "light.hpp"
14#include "morph.hpp"
15#include <math.h>
16#include "dprint.hpp"
17#include "particle.hpp"
18#include "clisp.hpp"
19#include "compiled.hpp"
20#include "sbar.hpp"
21#include "help.hpp"
22#include "loadgame.hpp"
23#include "nfserver.hpp"
24#include "specache.hpp"
25
26extern int past_startup;
27
28property_manager *prop;
29int *backtiles;
30int *foretiles;
31JCFont *big_font,*console_font;
32int nforetiles,nbacktiles,f_wid,f_hi,b_wid,b_hi,total_songs=0,sfx_volume,music_volume,sound_avail=0;
33song *current_song=NULL;
34
35uint16_t current_start_type,start_position_type,last_start_number;
36int light_buttons[13];
37int joy_picts[2*9];
38palette *pal;
39
40int big_font_pict=-1,small_font_pict=-1,console_font_pict=-1,cdc_logo;
41
42int title_screen;
43
44color_filter *color_table;
45
46
47int border_tile,window_texture,
48    raise_volume,lower_volume,record_button,play_button,music_button,sfx_button,
49    window_colors,pause_image,damage_pict,block_pict,vmm_image,earth,earth_mask,clouds,
50    numbers[10],ok_button,cancel_button;
51
52int start_running=0;
53
54int c_mouse1,c_mouse2,c_normal,c_target;
55
56long bg_xmul,bg_xdiv,bg_ymul,bg_ydiv;    // brackground scroll rates
57char mouse_scrolling=0,palettes_locked=1,view_shift_disabled=0;
58
59int light_connection_color;
60
61
62image *load_image(spec_entry *e, bFILE *fp)
63{
64  image *im=new image(e,fp);
65  if (scale_mult!=1 || scale_div!=1)
66    im->resize(im->width()*scale_mult/scale_div,im->height()*scale_mult/scale_div);
67  return im; 
68}
69
70image *load_image(bFILE *fp)
71{
72  image *im=new image(fp);
73  if (scale_mult!=1 || scale_div!=1)
74    im->resize(im->width()*scale_mult/scale_div,im->height()*scale_mult/scale_div);
75
76  return im; 
77}
78
79void use_file(char *filename, bFILE *&fp, spec_directory *&sd)
80{
81  char fn[100];
82  fp=open_file(filename,"rb");
83  if (fp->open_failure())
84  {
85    delete fp;
86    sprintf(fn,"art/%s",filename); 
87    fp=open_file(fn,"rb");
88    if (fp->open_failure())
89    {
90      printf("Unable to open file %s\n",filename);
91      delete fp;
92      exit(1);
93    }
94  }
95  sd=new spec_directory(fp);
96}
97
98void done_file(bFILE *&fp, spec_directory *&sd)
99{
100  delete fp;
101  delete sd;
102}
103
104void insert_tiles(char *filename)
105{
106  bFILE *fp=open_file(filename,"rb");
107  if (!fp->open_failure())
108  {
109    int ft=0,bt=0;
110    spec_directory sd(fp);
111    delete fp;
112    int i=0;
113    for (;i<sd.total;i++)   
114    {
115      spec_entry *se=sd.entries[i];
116      if (se->type==SPEC_FORETILE)
117        ft++;
118      else if (se->type==SPEC_BACKTILE)
119        bt++;     
120    }
121    if (bt)
122      printf("%s : adding %d background tiles (range %d-%d)\n",
123             filename,bt,nbacktiles,nbacktiles+bt-1);
124    if (ft)
125      printf("%s : adding %d foreground tiles (range %d-%d)\n",
126             filename,ft,nforetiles,nforetiles+bt-1);
127    if (!ft && !bt)   
128      printf("Warning : file %s has no background or foreground tiles\n",filename);
129    else
130    {
131      int fon=nforetiles,bon=nbacktiles;
132      if (ft)
133        foretiles=(int *)jrealloc(foretiles,sizeof(int)*(nforetiles+ft),"foretile id array ptrs");
134      if (bt)
135        backtiles=(int *)jrealloc(backtiles,sizeof(int)*(nbacktiles+bt),"foretile id array ptrs");
136
137      for (i=0;i<sd.total;i++)
138      {
139        if (sd.entries[i]->type==SPEC_FORETILE)
140        {
141          foretiles[fon]=cash.reg(filename,sd.entries[i]->name);
142          fon++;
143          nforetiles++;
144        }
145        if (sd.entries[i]->type==SPEC_BACKTILE)
146        {
147          backtiles[bon]=cash.reg(filename,sd.entries[i]->name);
148          bon++;
149          nbacktiles++;
150        }
151      }   
152    }
153  } else
154    printf("Warning : insert_tiles -> file %s could not be read from\n",filename);
155}
156
157void load_tiles(Cell *file_list)
158
159  bFILE *fp;
160  spec_directory *sd;
161  spec_entry *spe;
162 
163 
164  int num;
165
166
167
168  Cell *fl;
169  int old_fsize=nforetiles,
170      old_bsize=nbacktiles;
171
172  for (fl=file_list;!NILP(fl);fl=lcdr(fl))
173  {
174    fp=open_file(lstring_value(lcar(fl)),"rb");
175    if (fp->open_failure())
176    {
177      printf("Warning : open %s for reading\n",lstring_value(lcar(fl)));
178      delete fp;
179    }
180    else
181    {
182      sd=new spec_directory(fp);
183      delete fp;
184      int i;
185      for (i=0;i<sd->total;i++)
186      {
187        spe=sd->entries[i];
188        switch (spe->type)
189        {
190          case SPEC_BACKTILE :
191            if (!sscanf(spe->name,"%d",&num))
192              printf("Warning : background tile %s has no number\n",spe->name);
193            else if (nbacktiles<=num) nbacktiles=num+1;
194          break;
195
196          case SPEC_FORETILE :
197            if (!sscanf(spe->name,"%d",&num))
198              printf("Warning : foreground tile %s has no number\n",spe->name);
199            else if (nforetiles<=num) nforetiles=num+1;
200          break;
201        }
202      }
203      delete sd;
204    }
205  }
206
207  // enlarge the arrays if needed.
208  if (nbacktiles>old_bsize)
209  {
210    backtiles=(int *)jrealloc(backtiles,sizeof(int)*nbacktiles,"backtile id array ptrs");
211    memset(backtiles+old_bsize,-1,(nbacktiles-old_bsize)*sizeof(int));
212  }
213
214  if (nforetiles>old_fsize)
215  {
216    foretiles=(int *)jrealloc(foretiles,sizeof(int)*nforetiles,"foretile id array ptrs");
217    memset(foretiles+old_fsize,-1,(nforetiles-old_fsize)*sizeof(int));
218  }
219
220
221// now load them up
222  for (fl=file_list;!NILP(fl);fl=lcdr(fl))
223  {
224    char const *fn=lstring_value(lcar(fl));
225    fp=open_file(fn,"rb");
226    if (!fp->open_failure())
227    {
228      sd=new spec_directory(fp);
229      delete fp;
230
231      int i;
232      for (i=0;i<sd->total;i++)
233      {
234        spe=sd->entries[i];
235        switch (spe->type)
236        {
237          case SPEC_BACKTILE :
238           
239            if (sscanf(spe->name,"%d",&num))
240            {
241              if (backtiles[num]>=0)
242              {
243                dprintf("Warning : background tile %d redefined\n",num);
244                cash.unreg(backtiles[num]);
245              }
246              backtiles[num]=cash.reg(fn,spe->name,SPEC_BACKTILE);           
247            }
248            break;
249          case SPEC_FORETILE :
250            if (sscanf(spe->name,"%d",&num))
251            {
252              if (foretiles[num]>=0)
253              {
254                dprintf("Warning : foreground tile %d redefined\n",num);
255                cash.unreg(foretiles[num]);
256              }
257              foretiles[num]=cash.reg(fn,spe->name,SPEC_FORETILE);
258            }
259            break;
260        }
261      }
262      delete sd;
263    } else delete fp;
264  }
265
266}
267
268
269extern unsigned char fnt6x13[192*104];
270char lsf[256]="abuse.lsp";
271
272void load_data(int argc, char **argv)
273{
274        total_objects=0;
275        total_weapons=0;
276        weapon_types=NULL;
277        figures=NULL;
278        nforetiles=nbacktiles=0;
279        foretiles=NULL;
280        backtiles=NULL;
281        pal=NULL;
282        color_table=NULL;
283
284# if 0
285        int should_save_sd_cache = 0;
286
287        char *cachepath;
288        cachepath = (char *)jmalloc( strlen( get_save_filename_prefix() ) + 12 + 1, "cachepath" );
289        sprintf( cachepath, "%ssd_cache.tmp", get_save_filename_prefix() );
290
291        bFILE *load = open_file( cachepath, "rb" );
292        if( !load->open_failure() )
293        {
294                sd_cache.load( load );
295        }
296        else
297        {
298                should_save_sd_cache = 1;
299        }
300        delete load;
301#endif
302
303  if (!net_start())              // don't let them specify a startup file we are connect elsewhere
304  {
305    for (int i=1;i<argc;i++)
306    {
307      if (!strcmp(argv[i],"-lsf"))
308      {
309        i++;
310        strcpy(lsf,argv[i]);
311      }
312      if (!strcmp(argv[i],"-a"))
313      {
314        i++;
315        sprintf(lsf,"addon/%s/%s.lsp",argv[i],argv[i]);     
316      }
317    }
318  } else if (!get_remote_lsf(net_server,lsf))
319  {
320    dprintf("Unable to get remote lsf from %s\n",net_server);
321    exit(0);
322  }
323  char prog[100];
324  char const *cs;
325
326  c_mouse1=cash.reg("art/dev.spe","c_mouse1",SPEC_IMAGE,0);
327  c_mouse2=cash.reg("art/dev.spe","c_mouse2",SPEC_IMAGE,0);
328  c_normal=cash.reg("art/dev.spe","c_normal",SPEC_IMAGE,0);
329  c_target=cash.reg("art/dev.spe","c_target",SPEC_IMAGE,0);
330
331
332  sprintf(prog,"(load \"%s\")\n",lsf);
333
334  cs=prog;
335  if (!eval(compile(cs)))
336  {
337    printf("unable to open file '%s'\n",lsf);
338    exit(0);
339  }
340  compiled_init();
341  clear_tmp();
342  resize_tmp(0x4000);
343
344  dprintf("Engine : Registering base graphics\n");
345  for (int z=0;z<=11;z++)
346  {
347    char nm[10];
348    sprintf(nm,"l%d",z);
349    light_buttons[z]=cash.reg("art/dev.spe",nm,SPEC_IMAGE,0);
350  }
351
352
353  image *tmp_image=new image(192,104,fnt6x13);
354  big_font=new JCFont(tmp_image);
355  delete tmp_image;
356
357
358  char const *ff;
359  if (DEFINEDP(symbol_value(make_find_symbol("frame_file"))))
360    ff=lstring_value(symbol_value(make_find_symbol("frame_file")));
361  else
362    ff="art/frame.spe";
363
364  ok_button   =      cash.reg(ff,"dev_ok",SPEC_IMAGE);
365  cancel_button  =   cash.reg(ff,"cancel",SPEC_IMAGE);
366
367//  clouds      =      cash.reg(ff,"clouds",SPEC_IMAGE);
368
369  lower_volume=      cash.reg(ff,"lower_volume",SPEC_IMAGE);
370  raise_volume=      cash.reg(ff,"raise_volume",SPEC_IMAGE);
371  music_button=      cash.reg(ff,"music",SPEC_IMAGE);
372  sfx_button=        cash.reg(ff,"sound_fx",SPEC_IMAGE);
373  record_button=     cash.reg(ff,"record",SPEC_IMAGE); 
374  play_button=       cash.reg(ff,"play",SPEC_IMAGE);
375  window_colors=     cash.reg(ff,"window_colors",SPEC_IMAGE);
376  pause_image=       cash.reg(ff,"pause_image",SPEC_IMAGE);
377  vmm_image=         cash.reg(ff,"vmm",SPEC_IMAGE);
378  border_tile=       cash.reg(ff,"border_tile",SPEC_IMAGE);
379  window_texture=    cash.reg(ff,"window_texture",SPEC_IMAGE);
380 
381
382  help_screens=NULL;
383  total_help_screens=0; 
384
385  if (DEFINEDP(symbol_value(l_help_screens)))
386  {
387    void *v=symbol_value(l_help_screens);
388    char *ff=lstring_value(CAR(v));  v=CDR(v);
389    total_help_screens=0;
390    while (v) { total_help_screens++; v=CDR(v); }
391    if (total_help_screens)
392    {
393      help_screens=(int *)jmalloc(sizeof(int)*total_help_screens,"help image ids");     
394      v=CDR(symbol_value(l_help_screens));
395      int i=0;
396      for (;v;v=CDR(v),i++)
397        help_screens[i]=cash.reg(ff,lstring_value(CAR(v)),SPEC_IMAGE);     
398    }
399    else
400      dprintf("Warning no help images following filename\n");
401  } 
402     
403  int i;
404  for (i=1;i<argc;i++)
405  {
406    if (!strcmp(argv[i],"-ec"))
407      set_symbol_value(l_empty_cache,true_symbol);
408    if (!strcmp(argv[i],"-t"))
409    {
410      i++;
411      insert_tiles(argv[i]);
412    }
413  }
414
415  if (DEFINEDP(symbol_value(l_title_screen)))
416    title_screen=cash.reg_object(NULL,symbol_value(l_title_screen),SPEC_IMAGE,1);
417  else title_screen=-1;
418
419  if (DEFINEDP(symbol_value(l_cdc_logo)))
420    cdc_logo=cash.reg_object(NULL,symbol_value(l_cdc_logo),SPEC_IMAGE,1);
421  else cdc_logo=-1;
422 
423  start_position_type=0xffff;
424  for(i=0;i<total_objects;i++)
425    if (!strcmp(object_names[i],"START"))
426      start_position_type=i;
427  if (start_position_type==0xffff)
428  {
429    printf("No object named START, cannot start game.\n");
430    exit(0);
431  }
432
433  sbar.load();
434 
435  load_number_icons();
436
437
438  ERROR(nbacktiles,"No background tiles defined!");
439  ERROR(nforetiles,"No foreground tiles defined!");
440  ERROR(foretiles[0]>=0,"No black (0) foreground tile defined!");
441  ERROR(backtiles[0]>=0,"No black (0) background tile defined!");
442  ERROR(big_font_pict!=-1 || small_font_pict!=-1,
443        "No font loaded (use load_big_font or load_small_font)!");
444  f_wid=cash.foret(foretiles[0])->im->width();
445  f_hi=cash.foret(foretiles[0])->im->height();
446  b_wid=cash.backt(backtiles[0])->im->width();
447  b_hi=cash.backt(backtiles[0])->im->height();
448
449#if 0
450        if( should_save_sd_cache )
451        {
452                bFILE *save = open_file( cachepath, "wb" );
453                if( !save->open_failure() )
454                {
455                        sd_cache.save( save );
456                }
457                delete save;
458        }
459#endif
460
461        sd_cache.clear();
462        past_startup = 1;
463#if 0
464        jfree( cachepath );
465#endif
466}
467
468
469
470
471
472char *load_script(char *name)
473{
474  char fn[100];
475  char *s;
476 
477  sprintf(fn,"%s",name);
478  bFILE *fp=open_file(fn,"rb");
479  if (fp->open_failure())
480  {
481    delete fp;
482    return NULL;
483  }
484 
485  long l=fp->file_size();
486  s=(char *)jmalloc(l+1,"loaded script");
487  ERROR(s,"Malloc error in load_script");
488 
489  fp->read(s,l); 
490  s[l]=0;
491  delete fp;
492  return s; 
493}
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
Note: See TracBrowser for help on using the repository browser.