File: decor.c

package info (click to toggle)
crossfire 1.11.0-2
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 24,456 kB
  • ctags: 7,800
  • sloc: ansic: 80,483; sh: 11,825; perl: 2,327; lex: 1,946; makefile: 1,149
file content (104 lines) | stat: -rw-r--r-- 3,666 bytes parent folder | download
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
/*
 * static char *rcsid_decor_ =
 *   "$Id: decor.c 4961 2006-09-21 05:14:18Z mwedel $";
 */

/*
    CrossFire, A Multiplayer game for X-windows

    Copyright (C) 2002 Mark Wedel & Crossfire Development Team
    Copyright (C) 1992 Frank Tore Johansen

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

    The authors can be reached via e-mail at crossfire-devel@real-time.com
*/


#include <global.h>
#include <random_map.h>
#include <rproto.h>

#define NR_DECOR_OPTIONS 1

/* return a simple count of objects in the map at x,y. */

int obj_count_in_map(mapstruct *map,int x,int y) {
  int count=0;
  object *tmp;
  for(tmp=get_map_ob(map,x,y);tmp!=NULL;tmp=tmp->above)
      count++;
  return count;
}
/* put the decor into the map.  Right now, it's very primitive. */

void put_decor(mapstruct *map,char **maze,char *decorstyle,int decor_option,RMParms *RP) {
  mapstruct *decor_map;
  char style_name[256];

  sprintf(style_name,"/styles/decorstyles");

  decor_map = find_style(style_name,decorstyle,-1);
  if(decor_map == NULL) return;
  /* pick a random option, only 1 option right now. */
  if(decor_option==0)
      decor_option = RANDOM() % NR_DECOR_OPTIONS +1;
  switch(decor_option) {
    case 0: break;
    case 1: { /* random placement of decor objects. */
        int number_to_place = RANDOM() % ( (RP->Xsize *RP->Ysize) / 5);
        int failures=0;
        object *new_decor_object;
        while(failures < 100 && number_to_place  > 0) {
            int x,y;
            x = RANDOM() % (RP->Xsize-2) +1;
            y = RANDOM() % (RP->Ysize-2) +1;
            if(maze[x][y]==0 && obj_count_in_map(map,x,y)<2) { /* empty */
                object *this_object;
                new_decor_object = pick_random_object(decor_map);
                this_object = arch_to_object(new_decor_object->arch);
                copy_object(new_decor_object,this_object);
                this_object->x = x;
                this_object->y = y;
                /* it screws things up if decor can stop people */
                this_object->move_block = MOVE_BLOCK_DEFAULT;
                insert_ob_in_map(this_object,map,NULL,0);
                number_to_place--;
            }
            else
                failures++;
        }
        break;
    }
    default: { /* place decor objects everywhere: tile the map. */
        int i,j;
        for(i=1;i<RP->Xsize-1;i++) for(j=1;j<RP->Ysize-1;j++) {
            if(maze[i][j]==0) {
                object *new_decor_object, *this_object;
                
                new_decor_object = pick_random_object(decor_map);
                this_object = arch_to_object(new_decor_object->arch);
                copy_object(new_decor_object,this_object);
                this_object->x = i;
                this_object->y = j;
                /* it screws things up if decor can stop people */
                this_object->move_block = MOVE_BLOCK_DEFAULT;
                insert_ob_in_map(this_object,map,NULL,0);
          }
      }
      break;
  }
  }
}