/usr/share/colossal-cave-adventure/adventure/model.py is in colossal-cave-adventure 1.4-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | """Classes representing Adventure game components.
Copyright 2010-2015 Brandon Rhodes. Licensed as free software under the
Apache License, Version 2.0 as detailed in the accompanying README.txt.
"""
class Move(object):
"""An entry in the travel table."""
is_forced = False
verbs = []
condition = None
action = None
def __repr__(self):
verblist = [ verb.text for verb in self.verbs ]
c = self.condition[0]
if c is None:
condition = ''
elif c == '%':
condition = ' %d%% of the time' % self.condition[1]
elif c == 'not_dwarf':
condition = ' if not a dwarf'
elif c == 'carrying':
condition = ' if carrying %s' % self.condition[1]
elif c == 'carrying_or_in_room_with':
condition = ' if carrying or in room with %s' % self.condition[1]
elif c == 'prop!=':
condition = ' if prop %d != %d' % self.condition[1:]
if isinstance(self.action, Room):
action = 'moves to %r' % (self.action.short_description
or self.action.long_description[:20]).strip()
elif isinstance(self.action, Message):
action = 'prints %r' % self.action.text
else:
action = 'special %d' % self.action
return '<{}{} {}>'.format('|'.join(verblist), condition, action)
class Room(object):
"""A location in the game."""
long_description = ''
short_description = ''
times_described = 0
visited = False
is_light = False
is_forbidden_to_pirate = False
liquid = None
trying_to_get_into_cave = False
trying_to_catch_bird = False
trying_to_deal_with_snake = False
lost_in_maze = False
pondering_dark_room = False
at_witts_end = False
def __init__(self):
self.travel_table = []
def __repr__(self):
return '<room {} at {}>'.format(self.n, hex(id(self)))
@property
def is_forced(self):
return self.travel_table and self.travel_table[0].is_forced
@property
def is_aboveground(self):
return 1 <= self.n <= 8
@property
def is_before_hall_of_mists(self):
return self.n < 15
@property
def is_after_hall_of_mists(self):
return self.n >= 15
@property
def is_dark(self):
return not self.is_light
class Word(object):
"""A word that can be used as part of a command."""
text = None
kind = None
default_message = None
def __init__(self):
self.synonyms = [ self ]
def __repr__(self):
return '<Word {}>'.format(self.text)
def __eq__(self, text):
return any( word.text == text for word in self.synonyms )
def add_synonym(self, other):
"""Every word in a group of synonyms shares the same list."""
self.synonyms.extend(other.synonyms)
other.synonyms = self.synonyms
class Object(object):
"""An object in the game, like a grate, or a rod with a rusty star."""
def __init__(self):
self.is_fixed = False
self.is_treasure = False
self.inventory_message = ''
self.messages = {}
self.names = []
self.prop = 0
self.rooms = []
self.starting_rooms = []
self.is_toting = False
self.contents = None # so the bottle can hold things
def __repr__(self):
return '<Object %d %s %x>' % (self.n, '/'.join(self.names), id(self))
def __hash__(self):
return self.n
def __eq__(self, other):
return any( text == other for text in self.names )
def is_at(self, room):
return room in self.rooms
def carry(self):
self.rooms[:] = []
self.is_toting = True
def drop(self, room):
self.rooms[:] = [ room ]
self.is_toting = False
def hide(self):
self.rooms[:] = []
self.is_toting = False
def destroy(self):
self.hide()
class Message(object):
"""A message for printing."""
text = ''
def __str__(self):
return self.text
class Hint(object):
"""A hint offered if the player loiters in one area too long."""
turns_needed = 0
turn_counter = 0
penalty = 0
question = None
message = None
used = False
def __init__(self):
self.rooms = []
class Dwarf(object):
is_dwarf = True
is_pirate = False
def __init__(self, room):
self.start_at(room)
self.has_seen_adventurer = False
def start_at(self, room):
self.room = room
self.old_room = room
def can_move(self, move):
if not isinstance(move.action, Room):
return False
room = move.action
return (room.is_after_hall_of_mists
and not room.is_forced
and not move.condition == ('%', 100))
class Pirate(Dwarf):
is_dwarf = False
is_pirate = True
|