… | |
… | |
35 | * The source argument can be 0 or the source object for this activation. |
35 | * The source argument can be 0 or the source object for this activation. |
36 | */ |
36 | */ |
37 | void |
37 | void |
38 | activate_connection_link (objectlink * ol, bool state, object *source = 0) |
38 | activate_connection_link (objectlink * ol, bool state, object *source = 0) |
39 | { |
39 | { |
40 | object *tmp = 0; |
|
|
41 | |
|
|
42 | for (; ol; ol = ol->next) |
40 | for (; ol; ol = ol->next) |
43 | { |
41 | { |
44 | if (!ol->ob) |
42 | if (!ol->ob) |
45 | { |
43 | { |
46 | LOG (llevError, "Internal error in activate_connection_link.\n"); |
44 | LOG (llevError, "Internal error in activate_connection_link.\n"); |
… | |
… | |
55 | * re-loaded. As such, just exit this function if that is the case. |
53 | * re-loaded. As such, just exit this function if that is the case. |
56 | */ |
54 | */ |
57 | |
55 | |
58 | if (QUERY_FLAG (ol->ob, FLAG_FREED)) |
56 | if (QUERY_FLAG (ol->ob, FLAG_FREED)) |
59 | return; |
57 | return; |
|
|
58 | |
60 | tmp = ol->ob; |
59 | object *tmp = ol->ob; |
61 | |
60 | |
62 | /* if the criteria isn't appropriate, don't do anything */ |
61 | /* if the criteria isn't appropriate, don't do anything */ |
63 | if (state && !QUERY_FLAG (tmp, FLAG_ACTIVATE_ON_PUSH)) |
62 | if (state && !QUERY_FLAG (tmp, FLAG_ACTIVATE_ON_PUSH)) |
64 | continue; |
63 | continue; |
65 | if (!state && !QUERY_FLAG (tmp, FLAG_ACTIVATE_ON_RELEASE)) |
64 | if (!state && !QUERY_FLAG (tmp, FLAG_ACTIVATE_ON_RELEASE)) |
66 | continue; |
65 | continue; |
67 | |
66 | |
68 | switch (tmp->type) |
67 | switch (tmp->type) |
69 | { |
68 | { |
70 | case GATE: |
69 | case GATE: |
71 | case HOLE: |
70 | case HOLE: |
72 | tmp->value = tmp->stats.maxsp ? !state : state; |
71 | tmp->value = tmp->stats.maxsp ? !state : state; |
73 | tmp->speed = 0.5; |
72 | tmp->speed = 0.5; |
74 | update_ob_speed (tmp); |
73 | update_ob_speed (tmp); |
75 | break; |
74 | break; |
76 | |
75 | |
77 | case CF_HANDLE: |
76 | case CF_HANDLE: |
78 | SET_ANIMATION (tmp, (tmp->value = tmp->stats.maxsp ? !state : state)); |
77 | SET_ANIMATION (tmp, (tmp->value = tmp->stats.maxsp ? !state : state)); |
79 | update_object (tmp, UP_OBJ_FACE); |
78 | update_object (tmp, UP_OBJ_FACE); |
80 | break; |
79 | break; |
81 | |
80 | |
82 | case SIGN: |
81 | case SIGN: |
83 | if (!tmp->stats.food || tmp->last_eat < tmp->stats.food) |
82 | if (!tmp->stats.food || tmp->last_eat < tmp->stats.food) |
84 | { |
83 | { |
85 | new_info_map (NDI_UNIQUE | NDI_NAVY, tmp->map, tmp->msg); |
84 | new_info_map (NDI_UNIQUE | NDI_NAVY, tmp->map, tmp->msg); |
86 | if (tmp->stats.food) |
85 | if (tmp->stats.food) |
87 | tmp->last_eat++; |
86 | tmp->last_eat++; |
88 | } |
87 | } |
89 | break; |
88 | break; |
90 | |
89 | |
91 | case ALTAR: |
90 | case ALTAR: |
92 | tmp->value = 1; |
91 | tmp->value = 1; |
93 | SET_ANIMATION (tmp, tmp->value); |
92 | SET_ANIMATION (tmp, tmp->value); |
94 | update_object (tmp, UP_OBJ_FACE); |
93 | update_object (tmp, UP_OBJ_FACE); |
95 | break; |
94 | break; |
96 | |
95 | |
97 | case BUTTON: |
96 | case BUTTON: |
98 | case PEDESTAL: |
97 | case PEDESTAL: |
99 | tmp->value = state; |
98 | tmp->value = state; |
100 | SET_ANIMATION (tmp, tmp->value); |
99 | SET_ANIMATION (tmp, tmp->value); |
101 | update_object (tmp, UP_OBJ_FACE); |
100 | update_object (tmp, UP_OBJ_FACE); |
102 | break; |
101 | break; |
103 | |
102 | |
104 | case MOOD_FLOOR: |
103 | case MOOD_FLOOR: |
105 | do_mood_floor (tmp, source); |
104 | do_mood_floor (tmp, source); |
106 | break; |
105 | break; |
107 | |
106 | |
108 | case TIMED_GATE: |
107 | case TIMED_GATE: |
109 | tmp->speed = tmp->arch->clone.speed; |
108 | tmp->speed = tmp->arch->clone.speed; |
110 | update_ob_speed (tmp); /* original values */ |
109 | update_ob_speed (tmp); /* original values */ |
111 | tmp->value = tmp->arch->clone.value; |
110 | tmp->value = tmp->arch->clone.value; |
112 | tmp->stats.sp = 1; |
111 | tmp->stats.sp = 1; |
113 | tmp->stats.hp = tmp->stats.maxhp; |
112 | tmp->stats.hp = tmp->stats.maxhp; |
114 | /* Handle multipart gates. We copy the value for the other parts |
113 | /* Handle multipart gates. We copy the value for the other parts |
115 | * from the head - this ensures that the data will consistent |
114 | * from the head - this ensures that the data will consistent |
116 | */ |
115 | */ |
117 | for (tmp = tmp->more; tmp != NULL; tmp = tmp->more) |
116 | for (tmp = tmp->more; tmp != NULL; tmp = tmp->more) |
118 | { |
117 | { |
119 | tmp->speed = tmp->head->speed; |
118 | tmp->speed = tmp->head->speed; |
120 | tmp->value = tmp->head->value; |
119 | tmp->value = tmp->head->value; |
121 | tmp->stats.sp = tmp->head->stats.sp; |
120 | tmp->stats.sp = tmp->head->stats.sp; |
122 | tmp->stats.hp = tmp->head->stats.hp; |
121 | tmp->stats.hp = tmp->head->stats.hp; |
123 | update_ob_speed (tmp); |
122 | update_ob_speed (tmp); |
124 | } |
123 | } |
125 | break; |
124 | break; |
126 | |
125 | |
127 | case DIRECTOR: |
126 | case DIRECTOR: |
128 | case FIREWALL: |
127 | case FIREWALL: |
129 | if (!QUERY_FLAG (tmp, FLAG_ANIMATE) && tmp->type == FIREWALL) |
128 | if (!QUERY_FLAG (tmp, FLAG_ANIMATE) && tmp->type == FIREWALL) |
130 | move_firewall (tmp); |
129 | move_firewall (tmp); |
131 | else |
130 | else |
132 | { |
131 | { |
133 | if ((tmp->stats.sp += tmp->stats.maxsp) > 8) /* next direction */ |
132 | if ((tmp->stats.sp += tmp->stats.maxsp) > 8) /* next direction */ |
134 | tmp->stats.sp = ((tmp->stats.sp - 1) % 8) + 1; |
133 | tmp->stats.sp = ((tmp->stats.sp - 1) % 8) + 1; |
135 | animate_turning (tmp); |
134 | animate_turning (tmp); |
136 | } |
135 | } |
137 | break; |
136 | break; |
138 | |
137 | |
139 | case TELEPORTER: |
138 | case TELEPORTER: |
140 | move_teleporter (tmp); |
139 | move_teleporter (tmp); |
141 | break; |
140 | break; |
142 | |
141 | |
143 | case CREATOR: |
142 | case CREATOR: |
144 | move_creator (tmp); |
143 | move_creator (tmp); |
145 | break; |
144 | break; |
146 | |
145 | |
147 | case TRIGGER_MARKER: |
146 | case TRIGGER_MARKER: |
148 | move_marker (tmp); |
147 | move_marker (tmp); |
149 | break; |
148 | break; |
150 | |
149 | |
151 | case DUPLICATOR: |
150 | case DUPLICATOR: |
152 | move_duplicator (tmp); |
151 | move_duplicator (tmp); |
153 | break; |
152 | break; |
154 | } |
153 | } |
155 | } |
154 | } |
156 | } |
155 | } |
157 | |
156 | |
158 | /* |
157 | /* |
… | |
… | |
609 | if (!map) |
608 | if (!map) |
610 | { |
609 | { |
611 | LOG (llevError, "Tried to add button-link without map.\n"); |
610 | LOG (llevError, "Tried to add button-link without map.\n"); |
612 | return; |
611 | return; |
613 | } |
612 | } |
614 | if (!editor) |
613 | |
615 | button->path_attuned = connected; /* peterm: I need this so I can rebuild |
614 | button->path_attuned = connected; /* peterm: I need this so I can rebuild |
616 | a connected map from a template map. */ |
615 | a connected map from a template map. */ |
617 | |
|
|
618 | /* LOG(llevDebug,"adding button %s (%d)\n", button->name, connected);*/ |
|
|
619 | |
616 | |
620 | SET_FLAG (button, FLAG_IS_LINKED); |
617 | SET_FLAG (button, FLAG_IS_LINKED); |
621 | |
618 | |
622 | ol->ob = button; |
619 | ol->ob = button; |
623 | |
620 | |
624 | for (obp = map->buttons; obp && obp->value != connected; obp = obp->next); |
621 | for (obp = map->buttons; obp && obp->value != connected; obp = obp->next) |
|
|
622 | ; |
625 | |
623 | |
626 | if (obp) |
624 | if (obp) |
627 | { |
625 | { |
628 | ol->next = obp->link; |
626 | ol->next = obp->link; |
629 | obp->link = ol; |
627 | obp->link = ol; |