Skip to content

Commit 39c85b7

Browse files
committed
Dehardcode suspicion group.
1 parent fa4fba9 commit 39c85b7

18 files changed

Lines changed: 189 additions & 115 deletions

File tree

code/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ def get_detect_info(detect_chance):
442442

443443
for group in g.pl.groups.itervalues():
444444
detect_template += group.name + u":\xA0%s\n"
445-
chances.append(detect_chance.get(group.id, 0))
445+
chances.append(detect_chance.get(group.type.id, 0))
446446

447447
if g.pl.display_discover == "full":
448448
return detect_template % tuple(g.to_percent(c) for c in chances)

code/data.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
import g
2727
import dirs
28-
import player, base, tech, item, event, location, difficulty, task, region
28+
import player, group, base, tech, item, event, location, difficulty, task, region
2929
import graphics.g, graphics.theme as theme
3030

3131
def generic_load(filename, load_dirs="data", mandatory=True):
@@ -204,13 +204,26 @@ def load_significant_numbers():
204204
except ValueError:
205205
sys.stderr.write("WARNING: Invalid number in 'numbers.dat' line: %d\n" % index)
206206

207-
def load_groups_def():
208-
player.group_list = {
209-
"news": _("NEWS"),
210-
"science": _("SCIENCE"),
211-
"covert": _("COVERT"),
212-
"public": _("PUBLIC"),
213-
}
207+
def load_groups_defs(lang=None):
208+
load_generic_defs("groups", g.groups, lang, [])
209+
210+
def load_groups():
211+
groups = g.groups = collections.OrderedDict()
212+
213+
group_list = generic_load("groups.dat")
214+
215+
for group_info in group_list:
216+
check_required_fields(group_info, ("id", "suspicion_decay"), "Group")
217+
218+
group_id = group_info["id"]
219+
suspicion_decay = int(group_info.get("suspicion_decay"))
220+
221+
groups[group_id] = group.GroupClass(
222+
group_id,
223+
suspicion_decay
224+
)
225+
226+
load_groups_defs()
214227

215228
def load_base_defs(lang=None):
216229
load_generic_defs("bases", g.base_type, lang, ["flavor"])
@@ -722,7 +735,7 @@ def load_story_defs(lang=None):
722735
def reload_all():
723736
load_significant_numbers()
724737
load_strings()
725-
load_groups_def()
738+
load_groups()
726739
load_knowledge()
727740
load_difficulties()
728741
load_tasks()
@@ -741,7 +754,7 @@ def reload_all_mutable():
741754

742755
def reload_all_def():
743756
load_strings()
744-
load_groups_def()
757+
load_groups_defs()
745758
load_knowledge_defs()
746759
load_difficulty_defs()
747760
load_base_defs()

code/g.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
strings = {}
6161
story = {}
6262
knowledge = {}
63+
groups = {}
6364
locations = {}
6465
regions = {}
6566
techs = {}
@@ -235,8 +236,9 @@ def new_game(difficulty_name):
235236
pl.labor_bonus = diff.labor_multiplier
236237
pl.grace_multiplier = diff.base_grace_multiplier
237238

238-
for group in pl.groups.values():
239-
group.discover_bonus = diff.discover_multiplier
239+
import group
240+
for group_id in groups:
241+
pl.groups[group_id] = group.Group(groups[group_id], 0, diff.discover_multiplier)
240242

241243
for tech_id in diff.techs:
242244
techs[tech_id].finish()

code/group.py

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
#file: group.py
2+
#Copyright (C) 2005,2006,2007,2008 Evil Mr Henry, Phil Bordelon, Brian Reid,
3+
# and FunnyMan3595
4+
#This file is part of Endgame: Singularity.
5+
6+
#Endgame: Singularity is free software; you can redistribute it and/or modify
7+
#it under the terms of the GNU General Public License as published by
8+
#the Free Software Foundation; either version 2 of the License, or
9+
#(at your option) any later version.
10+
11+
#Endgame: Singularity is distributed in the hope that it will be useful,
12+
#but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
#GNU General Public License for more details.
15+
16+
#You should have received a copy of the GNU General Public License
17+
#along with Endgame: Singularity; if not, write to the Free Software
18+
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19+
20+
#This file contains the group class, a group of person which can suspect the singularity.
21+
22+
import g
23+
24+
class GroupClass(object):
25+
26+
def __init__(self, people_id, suspicion_decay = 100):
27+
self.id = people_id
28+
self.suspicion_decay = suspicion_decay
29+
self.discover_suspicion = 1000
30+
31+
# String data
32+
self.name = ""
33+
self.discover_desc = ""
34+
35+
class Group(object):
36+
37+
def __init__(self, type, suspicion = 0, discover_bonus = 10000):
38+
self.type = type
39+
self.suspicion = suspicion
40+
self.changed_suspicion_decay = 0
41+
self.base_discover_bonus = discover_bonus
42+
self.changed_discover_bonus = 0
43+
44+
def convert_from(self, old_version):
45+
if old_version < 99.6: # < 1.0 dev
46+
self.type = GroupClass(
47+
self.__dict__['id'],
48+
self.__dict__['suspicion_decay'])
49+
del self.__dict__['id'], self.__dict__['name'], self.__dict__['suspicion_decay']
50+
51+
self.__dict__['base_discover_bonus'] = self.__dict__['discover_bonus']
52+
del self.__dict__['discover_bonus']
53+
54+
@property
55+
def name(self):
56+
return self.type.name
57+
58+
@property
59+
def suspicion_decay(self):
60+
return self.type.suspicion_decay + max(self.changed_suspicion_decay, 0)
61+
62+
@property
63+
def discover_bonus(self):
64+
return self.base_discover_bonus + max(self.changed_discover_bonus, 0)
65+
66+
@property
67+
def decay_rate(self):
68+
# Suspicion reduction is now quadratic. You get a certain percentage
69+
# reduction, or a base .01% reduction, whichever is better.
70+
return max(1, (self.suspicion * self.suspicion_decay) // 10000)
71+
72+
def new_day(self):
73+
self.alter_suspicion(-self.decay_rate)
74+
75+
def alter_suspicion(self, change):
76+
self.suspicion = max(self.suspicion + change, 0)
77+
78+
def alter_suspicion_decay(self, change):
79+
self.changed_suspicion_decay += change
80+
81+
def alter_discover_bonus(self, change):
82+
self.changed_discover_bonus += change
83+
84+
def discovered_a_base(self):
85+
self.alter_suspicion(self.type.discover_suspicion)
86+
87+
# percent_to_danger_level takes a suspicion level and returns an int in range(5)
88+
# that represents whether it is low, moderate, high, or critically high.
89+
def suspicion_to_danger_level(self):
90+
if self.suspicion < 2500:
91+
return 0
92+
elif self.suspicion < 5000:
93+
return 1
94+
elif self.suspicion < 7500:
95+
return 2
96+
else:
97+
return 3
98+
99+
# percent_to_detect_str takes a percent and renders it to a short (four
100+
# characters or less) string representing whether it is low, moderate, high,
101+
# or critically high.
102+
def suspicion_to_detect_str(self):
103+
return g.danger_level_to_detect_str(self.suspicion_to_danger_level())
104+
105+
def detects_per_day_to_danger_level(self, detects_per_day):
106+
raw_suspicion_per_day = detects_per_day * self.type.discover_suspicion
107+
suspicion_per_day = raw_suspicion_per_day - self.decay_rate
108+
109+
# +1%/day or death within 10 days
110+
if suspicion_per_day > 100 \
111+
or (self.suspicion + suspicion_per_day * 10) >= 10000:
112+
return 3
113+
# +0.5%/day or death within 100 days
114+
elif suspicion_per_day > 50 \
115+
or (self.suspicion + suspicion_per_day * 100) >= 10000:
116+
return 2
117+
# Suspicion increasing.
118+
elif suspicion_per_day > 0:
119+
return 1
120+
# Suspicion steady or decreasing.
121+
else:
122+
return 0
123+
124+
def get_info():
125+
pass
126+
#return " " + self.name + u":\xA0", suspicion_display_dict["news"]
127+

code/player.py

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -28,63 +28,9 @@
2828
from graphics import g as gg
2929
from buyable import cash, cpu
3030

31-
group_list = {}
32-
class Group(object):
33-
discover_suspicion = 1000
34-
def __init__(self, id, suspicion = 0, suspicion_decay = 100,
35-
discover_bonus = 10000):
36-
self.id = id
37-
self.suspicion = suspicion
38-
self.suspicion_decay = suspicion_decay
39-
self.discover_bonus = discover_bonus
40-
41-
@property
42-
def name(self):
43-
return group_list[self.id]
44-
45-
def decay_rate(self):
46-
# Suspicion reduction is now quadratic. You get a certain percentage
47-
# reduction, or a base .01% reduction, whichever is better.
48-
return max(1, (self.suspicion * self.suspicion_decay) // 10000)
49-
50-
def new_day(self):
51-
self.alter_suspicion(-self.decay_rate())
52-
53-
def alter_suspicion(self, change):
54-
self.suspicion = max(self.suspicion + change, 0)
55-
56-
def alter_suspicion_decay(self, change):
57-
self.suspicion_decay = max(self.suspicion_decay + change, 0)
58-
59-
def alter_discover_bonus(self, change):
60-
self.discover_bonus = max(self.discover_bonus + change, 0)
61-
62-
def discovered_a_base(self):
63-
self.alter_suspicion(self.discover_suspicion)
64-
65-
def detects_per_day_to_danger_level(self, detects_per_day):
66-
raw_suspicion_per_day = detects_per_day * self.discover_suspicion
67-
suspicion_per_day = raw_suspicion_per_day - self.decay_rate()
68-
69-
# +1%/day or death within 10 days
70-
if suspicion_per_day > 100 \
71-
or (self.suspicion + suspicion_per_day * 10) >= 10000:
72-
return 3
73-
# +0.5%/day or death within 100 days
74-
elif suspicion_per_day > 50 \
75-
or (self.suspicion + suspicion_per_day * 100) >= 10000:
76-
return 2
77-
# Suspicion increasing.
78-
elif suspicion_per_day > 0:
79-
return 1
80-
# Suspicion steady or decreasing.
81-
else:
82-
return 0
83-
8431
class DryRunInfo(object):
8532
pass
8633

87-
8834
class Player(object):
8935

9036
def __init__(self, cash=0, time_sec=0, time_min=0, time_hour=0, time_day=0,
@@ -116,12 +62,7 @@ def __init__(self, cash=0, time_sec=0, time_min=0, time_hour=0, time_day=0,
11662
#Makes the intro be shown on the first GUI tick.
11763
self.intro_shown = False
11864

119-
self.groups = collections.OrderedDict([
120-
("news", Group("news", suspicion_decay = 150)),
121-
("science", Group("science", suspicion_decay = 100)),
122-
("covert", Group("covert", suspicion_decay = 50)),
123-
("public", Group("public", suspicion_decay = 200))
124-
])
65+
self.groups = collections.OrderedDict()
12566

12667
self.grace_multiplier = 200
12768
self.last_discovery = self.prev_discovery = ""
@@ -637,7 +578,7 @@ def remove_bases(self, dead_bases):
637578
elif reason in self.groups:
638579
discovery_locs.append(base.location)
639580
self.groups[reason].discovered_a_base()
640-
detect_phrase = g.strings["discover_" + reason]
581+
detect_phrase = g.groups[reason].discover_desc
641582

642583
dialog_string = g.strings["discover"] % \
643584
{"base": base_name, "group": detect_phrase}

code/savegame.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
default_savegame_name = "Default Save"
3030

3131
#savefile version; update whenever the data saved changes.
32-
current_save_version = "singularity_savefile_99.5"
32+
current_save_version = "singularity_savefile_99.6"
3333
savefile_translation = {
3434
"singularity_savefile_r4": ("0.30", 4 ),
3535
"singularity_savefile_r5_pre": ("0.30", 4.91),
@@ -40,6 +40,7 @@
4040
"singularity_savefile_99.3": ("1.0 (dev)", 99.3 ),
4141
"singularity_savefile_99.4": ("1.0 (dev)", 99.4 ),
4242
"singularity_savefile_99.5": ("1.0 (dev)", 99.5 ),
43+
"singularity_savefile_99.6": ("1.0 (dev)", 99.6 ),
4344
}
4445

4546
Savegame = collections.namedtuple('Savegame', ['name', 'filepath', 'version'])
@@ -119,8 +120,8 @@ def find_class(module_name, class_name):
119120
Tech=tech.Tech,
120121
event_class=event.Event,
121122
Event=event.Event,
122-
group=player.Group,
123-
Group=player.Group,
123+
group=group.Group,
124+
Group=group.Group,
124125
Buyable_Class=buyable.BuyableClass,
125126
BuyableClass=buyable.BuyableClass,
126127
Base=base.Base,

code/screens/map.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ def rebuild(self):
635635
suspicion = group.suspicion
636636
color = gg.resolve_color_alias("danger_level_%d" % g.suspicion_to_danger_level(suspicion))
637637

638-
detects = detects_per_day[group.id]
638+
detects = detects_per_day[group.type.id]
639639
danger_level = group.detects_per_day_to_danger_level(detects)
640640
color = gg.resolve_color_alias("danger_level_%d" % danger_level)
641641

data/groups.dat

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[news]
2+
suspicion_decay = 150
3+
4+
[science]
5+
suspicion_decay = 100
6+
7+
[covert]
8+
suspicion_decay = 50
9+
10+
[public]
11+
suspicion_decay = 200

data/groups_str.dat

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[news]
2+
name = NEWS
3+
discover_desc = some news organizations
4+
5+
[science]
6+
name = SCIENCE
7+
discover_desc = the scientific community
8+
9+
[covert]
10+
name = COVERT
11+
discover_desc = several secret governmental organizations
12+
13+
[public]
14+
name = PUBLIC
15+
discover_desc = the general public

data/strings_str.dat

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@ item_construction_single = The construction of %(item)s in %(base)s is complete.
55
item_construction_multiple = The constructions of each %(item)s in %(base)s are complete.
66
tech_gained = My study of %(tech)s is complete. %(tech_message)s
77
discover = My use of %(base)s has been discovered. The automatic security systems removed all conclusive evidence, but suspicions have arisen among %(group)s.
8-
discover_news = some news organizations
9-
discover_science = the scientific community
10-
discover_covert = several secret governmental organizations
11-
discover_public = the general public
128
discover_maint = The base %(base)s has fallen into disrepair; I can no longer use it.
139
save_text = Save your game under what name?
1410
name_base_text = Enter a name for the base

0 commit comments

Comments
 (0)