-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrule.c
More file actions
110 lines (102 loc) · 3.56 KB
/
rule.c
File metadata and controls
110 lines (102 loc) · 3.56 KB
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
//
// Created by Aref on 19/06/29.
//
#include "rule.h"
#include "etc.h"
int init_rule(FILE *file, Rule *rule) {
char line[50];
while (get_line(file, line))
parser(line, rule);
parser(line, rule);
return 1;
}
int parser(char *line, Rule *rule) {
int i = find(line, '=');
if (i == NOT_FOUND)
return 0;
char left[20];
from_to(line, left, 0, i);
//and now ifs beginssss :)
if (compare(left, "solidblock"))
sscanf(line, "solidblock=%c", &(rule->solid_block));
else if (compare(left, "deathblock"))
sscanf(line, "deathblock=%c", &(rule->death_block));
else if (compare(left, "raindb"))
sscanf(line, "raindb=%d", &(rule->raindb));
else if (compare(left, "moveblock"))
sscanf(line, "moveblock=%c", &(rule->move_block));
else if (compare(left, "wall"))
sscanf(line, "wall=%c", &(rule->wall));
else if (compare(left, "character"))
sscanf(line, "character=%c", &(rule->charecter));
else if (compare(left, "target"))
sscanf(line, "target=%c", &(rule->target));
else if (compare(left, "object"))
sscanf(line, "object=%c", &(rule->object));
else if (compare(left, "left"))
sscanf(line, "left=%c", &(rule->left));
else if (compare(left, "right"))
sscanf(line, "right=%c", &(rule->right));
else if (compare(left, "up"))
sscanf(line, "up=%c", &(rule->up));
else if (compare(left, "down"))
sscanf(line, "down=%c", &(rule->down));
else if (compare(left, "exit"))
sscanf(line, "exit=%c", &(rule->exit));
else if (compare(left, "time"))
sscanf(line, "time=%d", &(rule->time));
else if (compare(left, "attack"))
sscanf(line, "attack=%d", &(rule->attack_range));
else if (compare(left, "rpoint"))
sscanf(line, "rpoint=%c,%d,%d", &(rule->rpoints.charecter), &(rule->rpoints.point), &(rule->rpoints.number));
else if (compare(left, "opp"))
sscanf(line, "opp=%c, %c", &(rule->opp.charecter), &(rule->opp.target));
else if (compare(left, "put"))
sscanf(line, "put=%c,%c,%d", &(rule->put.control), &(rule->put.charecter), &(rule->put.number));
}
void init_rule2(Rule *rule) {
rule->solid_block = NOT_DEFINE;
rule->death_block = NOT_DEFINE;
rule->raindb = NOT_DEFINE;
rule->move_block = NOT_DEFINE;
rule->wall = NOT_DEFINE;
rule->charecter = NOT_DEFINE;
rule->target = NOT_DEFINE;
rule->object = NOT_DEFINE;
rule->up = NOT_DEFINE;
rule->down = NOT_DEFINE;
rule->right = NOT_DEFINE;
rule->left = NOT_DEFINE;
rule->exit = NOT_DEFINE;
rule->time = NOT_DEFINE;
rule->attack_range = NOT_DEFINE;
rule->rpoints = (Point_R) {NOT_DEFINE, NOT_DEFINE, NOT_DEFINE};
rule->opp = (Opp_R) {NOT_DEFINE, NOT_DEFINE};
rule->put = (Put_R) {NOT_DEFINE, NOT_DEFINE, NOT_DEFINE};
}
int can_go(Rule *rule, char c) {
if (c == (char)rule->solid_block)
return 0;
if(c == (char)rule->wall)
return 0;
return 1;
}
int die(Rule *rule, char c) {
if(c == (char)rule->death_block)
return 1;
return 0;
}
int is_obj(Rule *rule, char c) {
return c == (char)rule->solid_block ||
c == (char)rule->death_block ||
c == (char)rule->move_block ||
c == (char)rule->wall ||
c == (char)rule->charecter ||
c == (char)rule->target ||
c == (char)rule->object ||
c == (char)rule->rpoints.charecter ||
c == (char)rule->opp.charecter;
}
int is_obj_opp(Rule *rule, char c) {
return is_obj(rule, c) && c != (char)rule->opp.target;
}