-
Notifications
You must be signed in to change notification settings - Fork 1
/
signpost.cpp
126 lines (106 loc) · 1.95 KB
/
signpost.cpp
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
/*
* PROPRIETARY INFORMATION. This software is proprietary to POWDER
* Development, and is not to be reproduced, transmitted, or disclosed
* in any way without written permission.
*
* Produced by: Jeff Lait
*
* POWDER Development
*
* NAME: signpost.cpp ( POWDER Library, C++ )
*
* COMMENTS:
* Tracks signposts and their values. Creates a heap of signposts
* which can be queried to get a sign at a position. O(N) to
* access so be wary!
*/
#include "signpost.h"
#include "sramstream.h"
void
SIGNPOSTDATA::init(SIGNPOST_NAMES sign, int x, int y)
{
myPos = y & 31;
myPos <<= 5;
myPos |= x & 31;
mySign = sign;
}
bool
SIGNPOSTDATA::isPos(int x, int y) const
{
int x1, y1;
getPos(x1, y1);
return (x1 == x) && (y1 == y);
}
void
SIGNPOSTDATA::getPos(int &x, int &y) const
{
x = myPos & 31;
y = myPos >> 5;
}
SIGNPOST_NAMES
SIGNPOSTDATA::getSign() const
{
return (SIGNPOST_NAMES) mySign;
}
void
SIGNPOSTDATA::save(SRAMSTREAM &os) const
{
int collapse;
collapse = mySign << 10 | myPos;
os.write(collapse, 16);
}
void
SIGNPOSTDATA::load(SRAMSTREAM &is)
{
int val;
is.uread(val, 16);
myPos= val & 1023;
mySign= val >> 10;
}
SIGNLIST::SIGNLIST()
{
}
SIGNLIST::~SIGNLIST()
{
}
SIGNPOST_NAMES
SIGNLIST::find(int x, int y) const
{
int i;
for (i = 0; i < myPosts.entries(); i++)
{
if (myPosts(i).isPos(x, y))
return myPosts(i).getSign();
}
return SIGNPOST_NONE;
}
void
SIGNLIST::append(SIGNPOST_NAMES sign, int x, int y)
{
SIGNPOSTDATA post;
post.init(sign, x, y);
myPosts.append(post);
}
void
SIGNLIST::save(SRAMSTREAM &os) const
{
int i;
os.write(myPosts.entries(), 8);
for (i = 0; i < myPosts.entries(); i++)
{
myPosts(i).save(os);
}
}
void
SIGNLIST::load(SRAMSTREAM &is)
{
int i;
int val;
is.uread(val, 8);
for (i = 0; i < val; i++)
{
SIGNPOSTDATA post;
post.load(is);
myPosts.append(post);
}
}