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