1 /*
2
3 Copyright (C) 2015-2018 Night Dive Studios, LLC.
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 */
19 #include "shodan.h"
20 #include "player.h"
21 #include "objclass.h"
22 #include "otrip.h"
23 #include "newmfd.h"
24 #include "hud.h"
25 #include "faketime.h"
26
27 // ---------------
28 // Internal Prototypes
29 // ---------------
30 errtype update_shodometer(short new_val, uchar game_stuff);
31
compute_shodometer_value(uchar game_stuff)32 short compute_shodometer_value(uchar game_stuff) {
33 if (player_struct.level <= MAX_SHODOMETER_LEVEL) {
34 QUESTVAR_SET(SHODAN_QV, 0);
35 for (ObjID oid = (objs[OBJ_NULL]).headused; oid != OBJ_NULL; oid = objs[oid].next) {
36 increment_shodan_value(oid, game_stuff);
37 }
38 return (QUESTVAR_GET(SHODAN_QV));
39 } else
40 return (0);
41 }
42
43 #define HUD_SHODOMETER_TICKS (CIT_CYCLE << 1)
44
update_shodometer(short new_val,uchar game_stuff)45 errtype update_shodometer(short new_val, uchar game_stuff) {
46 extern errtype do_shodan_triggers();
47 QUESTVAR_SET(SHODAN_QV, new_val);
48 if (game_stuff) {
49 mfd_notify_func(MFD_PLOTWARE_FUNC, MFD_INFO_SLOT, FALSE, MFD_ACTIVE, FALSE);
50 do_shodan_triggers();
51 hud_set_time(HUD_SHODOMETER, HUD_SHODOMETER_TICKS);
52 }
53 return (OK);
54 }
55
increment_shodan_value(ObjID oid,uchar game_stuff)56 short increment_shodan_value(ObjID oid, uchar game_stuff) {
57 short curr_shodan_val = QUESTVAR_GET(SHODAN_QV);
58
59 if (player_struct.level <= MAX_SHODOMETER_LEVEL) {
60 switch (ID2TRIP(oid)) {
61 #ifdef CREATURE_SHODOMETER
62 case CYBORG_DRONE_TRIPLE:
63 curr_shodan_val += CYBORG_DRONE_TRIPLE_VALUE;
64 break;
65 case WARRIOR_TRIPLE:
66 curr_shodan_val += WARRIOR_TRIPLE_VALUE;
67 break;
68 case ASSASSIN_TRIPLE:
69 curr_shodan_val += ASSASSIN_TRIPLE_VALUE;
70 break;
71 case CYBERBABE_TRIPLE:
72 curr_shodan_val += CYBERBABE_TRIPLE_VALUE;
73 break;
74 case ELITE_GUARD_TRIPLE:
75 curr_shodan_val += ELITE_GUARD_TRIPLE_VALUE;
76 break;
77 case CORTEX_REAVER_TRIPLE:
78 curr_shodan_val += CORTEX_REAVER_TRIPLE_VALUE;
79 break;
80 case MUTANT_BORG_TRIPLE:
81 curr_shodan_val += MUTANT_BORG_TRIPLE_VALUE;
82 break;
83 case SECURITY_BOT1_TRIPLE:
84 curr_shodan_val += SECURITY_BOT1_TRIPLE_VALUE;
85 break;
86 case SECURITY_BOT2_TRIPLE:
87 curr_shodan_val += SECURITY_BOT2_TRIPLE_VALUE;
88 break;
89 case EXECBOT_TRIPLE:
90 curr_shodan_val += EXECBOT_TRIPLE_VALUE;
91 break;
92 #endif
93 case CAMERA_TRIPLE:
94 curr_shodan_val += CAMERA_TRIPLE_VALUE;
95 break;
96 case SMALL_CPU_TRIPLE:
97 curr_shodan_val += SMALL_CPU_TRIPLE_VALUE;
98 break;
99 case LARGCPU_TRIPLE:
100 curr_shodan_val += LARGCPU_TRIPLE_VALUE;
101 break;
102 }
103 if (curr_shodan_val != QUESTVAR_GET(SHODAN_QV))
104 update_shodometer(curr_shodan_val, game_stuff);
105 return (curr_shodan_val);
106 } else
107 return (0);
108 }
109
decrement_shodan_value(ObjID oid,uchar game_stuff)110 short decrement_shodan_value(ObjID oid, uchar game_stuff) {
111 short curr_shodan_val = QUESTVAR_GET(SHODAN_QV);
112
113 if (player_struct.level <= MAX_SHODOMETER_LEVEL) {
114 switch (ID2TRIP(oid)) {
115 #ifdef CREATURE_SHODOMETER
116 case CYBORG_DRONE_TRIPLE:
117 curr_shodan_val -= CYBORG_DRONE_TRIPLE_VALUE;
118 break;
119 case WARRIOR_TRIPLE:
120 curr_shodan_val -= WARRIOR_TRIPLE_VALUE;
121 break;
122 case ASSASSIN_TRIPLE:
123 curr_shodan_val -= ASSASSIN_TRIPLE_VALUE;
124 break;
125 case CYBERBABE_TRIPLE:
126 curr_shodan_val -= CYBERBABE_TRIPLE_VALUE;
127 break;
128 case ELITE_GUARD_TRIPLE:
129 curr_shodan_val -= ELITE_GUARD_TRIPLE_VALUE;
130 break;
131 case CORTEX_REAVER_TRIPLE:
132 curr_shodan_val -= CORTEX_REAVER_TRIPLE_VALUE;
133 break;
134 case MUTANT_BORG_TRIPLE:
135 curr_shodan_val -= MUTANT_BORG_TRIPLE_VALUE;
136 break;
137 case SECURITY_BOT1_TRIPLE:
138 curr_shodan_val -= SECURITY_BOT1_TRIPLE_VALUE;
139 break;
140 case SECURITY_BOT2_TRIPLE:
141 curr_shodan_val -= SECURITY_BOT2_TRIPLE_VALUE;
142 break;
143 case EXECBOT_TRIPLE:
144 curr_shodan_val -= EXECBOT_TRIPLE_VALUE;
145 break;
146 #endif
147 case CAMERA_TRIPLE:
148 curr_shodan_val -= CAMERA_TRIPLE_VALUE;
149 break;
150 case SMALL_CPU_TRIPLE:
151 curr_shodan_val -= SMALL_CPU_TRIPLE_VALUE;
152 break;
153 case LARGCPU_TRIPLE:
154 curr_shodan_val -= LARGCPU_TRIPLE_VALUE;
155 break;
156 }
157 if (curr_shodan_val < 0) {
158 // Warning(("SHODOMETER negative after decrementing of id = 0x%x\n",oid));
159 curr_shodan_val = 0;
160 }
161 if (curr_shodan_val != QUESTVAR_GET(SHODAN_QV))
162 update_shodometer(curr_shodan_val, game_stuff);
163 return (curr_shodan_val);
164 } else
165 return (0);
166 }
167